ekwav / uf_oauth2_server
UserFrosting 的 OAuth2 Api 模块。
Requires
- league/oauth2-server: ^5.1
This package is not auto-updated.
Last update: 2024-09-29 03:31:13 UTC
README
在 userfrosting4 中实现 league/oauth2-server
它做什么?
使用这个插件,您可以安全地将您的应用程序与 Userfrosting 通过 OAuth2 授权流程连接起来。简而言之,这就是您在 Google、Facebook 等地方所熟知的“此应用程序希望获取访问权限 ...”。为了获取某些数据,您需要将用户重定向到 YourDomain.com/authorize/{{AppID}}/token/{{scope}},其中 AppID 是您应用程序的唯一标识符(您可以根据需要拥有任意多个),它将在您注册应用程序时生成。而 {{scope}} 是您应用程序权限列表,由 + 或 空格 分隔。您还可以将 token 替换为 code 以获取访问代码而不是令牌,更多信息请参阅 这里,但我推荐对于只想将他们的 unity3d 游戏连接到他们自己的服务器的人来说使用令牌。对于其他刚开始的人来说也是如此。
安装
- 编辑 UserFrosting
app/sprinkles.json文件,并将其添加到require列表中:"ekwav/uf_oauth2_server": "dev-master"。将OAuth2Server添加到base列表中。您的sprinkles.json应该如下所示
{
"require": {
"ekwav/uf_oauth2_server": "dev-master"
},
"base": [
"core",
"account",
"admin",
"OAuth2Server"
]
}
- 运行
composer update下载插件。 - 然后,您必须创建一个公钥和私钥,我们需要它们来加密令牌。
导航到app/sprinkles/Api/src/OAuth2,打开终端并运行openssl genrsa -out private.key 1024您也可以将 1024 替换为 2048 以生成更强的密钥 然后,您需要从私钥中提取公钥,使用openssl rsa -in private.key -pubout -out public.key。您也可以在其他地方生成密钥,如果是这样,请更改配置中的publicKey和privatKey路径(请查阅config/default.php以查看确切的结构)。有关密钥的更多信息,请参阅 这里。 - 生成一个
EncryptionKey并更改默认配置中的密钥,您可以使用php -r 'echo base64_encode(random_bytes(32)), PHP_EOL;'在您的命令行中完成此操作。
您可以使用此模板进行配置。请确保您已将其设置为根元素
'oauthserver' => [
'EncryptionKey' => 'YOURKEY'
]
- 在您的根 Userfrosting 目录中打开终端并运行
php bakery bake,等待它完成并关闭终端。
现在,您可以创建Clients即应用程序。 - 打开
YourDomain/apps并继续操作。
它看起来像这样
需要注意的重要事项
我的插件可能包含任何类型的错误和漏洞,如果您发现一个,请在问题标签中报告它。
如果您需要帮助,您可以在 userfrosting 聊天室 找到我。
-您必须在配置中添加每个API端点到csrf黑名单中。- 目前(2017年1月7日)这对我来说不起作用,因此我建议您在schema remoteapi/CUSTOMNAME 之后创建您的路由以自动覆盖它们。
'csrf' => [
// A list of URL paths to ignore CSRF checks on
'blacklist' => [
"^remoteapi/userinfo",
"^remoteapi/anotherEndpoint"
]
用法
通过将 ->add(new ResourceServerMiddleware($this->ci->ResourceServer)); 添加到您想要保护的路由来保护您的API端点。请记住 将其添加到csrfBlacklist。
现在该路由已受保护,并且只能通过使用POST和一个带有值 access token 的 Authorization 头部来访问。
如何获取access_token
获取access_token就像将用户从您的应用程序、移动应用程序或其他服务器重定向到您的Userfrosting安装一样简单。URL必须遵循以下模式 https://YOURDOMAIN.COM/authorize/APPID/code/SCOPES
您可以在 /apps 页面上找到您的APPID
SCOPES 是您想要获取的权限数组,由 空格 或 + (URL编码的 空格)分隔。
然后用户可以查看请求的权限并进行 授权、编辑 或 拒绝。
如果用户授权请求,他将被重定向到创建应用程序时指定的URL,并带有作为参数的 authorization code。然后您必须从URL中捕获它,并将其与您的应用程序密钥(您也可以在 /apps 页面上找到)一起发送到您的Userfrosting安装,但这次作为 POST 并发送到 https://YOURDOMAIN/oauth2/access_token,以下 参数: grant_type = authorization_code
client_id =您的应用程序ID(来自 /apps 页面) client_secret=您的应用程序密钥
code=您在第一个请求中收到的 athorization_code。这将返回一个包含 access_token 和 refresh_token 的 JSON 响应,您必须将它们都保存到设备/服务器存储中。
发送请求
现在您已经在用户的设备上有了令牌,您可以发送请求。将其作为带有键 Authorization 的头信息 POST 到您已受保护的路由,并且应该一切正常。但您问的是 refresh_token 是什么?6小时后(您可以在配置中更改它),access_token 无效,这样做的目的是如果令牌被第三方窃取,它将变得无用的。无论如何,您必须获取一个新的 access_token,您怎么做呢?
刷新访问
要获取新的 access_token,您必须向 /oauth2/access_token 发送带有 Body参数 的 POST 请求
grant_type=refresh_token
client_id=您的应用程序ID(来自 /apps 页面)
client_secret=您的应用程序密钥
refresh_token=您在第二次请求中收到的刷新令牌。这将返回新的 access_token 和新的 refresh_token,旧令牌现在应该被新令牌替换。
服务器端
但您如何在Userfrosting控制器中知道哪个用户正在从您那里请求数据?结果是,访问令牌是一个加密的JSON数组,即 JSON Web Token,它包含有关令牌的所有重要信息。它存储
- 用户_id
- app/client_id
- 作用域
- 过期时间。
- 访问令牌ID。(可用于从服务器端禁用它或用于跟踪目的)有关如何使用这些内容的示例,请参阅 ApiAuthController 中的
getUserInfo()函数
不要从授权页面移除 Powered by Coflnet,它必须保持可见。您可以根据需要修改MIT下的一切。