ekwav/uf_oauth2_server

该软件包最新版本(0.0.2)没有可用的许可证信息。

UserFrosting 的 OAuth2 Api 模块。

安装: 55

依赖项: 0

建议者: 0

安全: 0

星标: 5

关注者: 2

分支: 2

开放问题: 1

类型:userfrosting-sprinkle

0.0.2 2017-07-01 17:17 UTC

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 游戏连接到他们自己的服务器的人来说使用令牌。对于其他刚开始的人来说也是如此。

安装

  1. 编辑 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"
    ]
}
  1. 运行 composer update 下载插件。
  2. 然后,您必须创建一个公钥和私钥,我们需要它们来加密令牌。
    导航到 app/sprinkles/Api/src/OAuth2,打开终端并运行 openssl genrsa -out private.key 1024 您也可以将 1024 替换为 2048 以生成更强的密钥 然后,您需要从私钥中提取公钥,使用 openssl rsa -in private.key -pubout -out public.key。您也可以在其他地方生成密钥,如果是这样,请更改配置中的 publicKeyprivatKey 路径(请查阅 config/default.php 以查看确切的结构)。有关密钥的更多信息,请参阅 这里
  3. 生成一个 EncryptionKey 并更改默认配置中的密钥,您可以使用 php -r 'echo base64_encode(random_bytes(32)), PHP_EOL;' 在您的命令行中完成此操作。
    您可以使用此模板进行配置。请确保您已将其设置为根元素
'oauthserver' => [
'EncryptionKey' => 'YOURKEY'
]  
  1. 在您的根 Userfrosting 目录中打开终端并运行 php bakery bake,等待它完成并关闭终端。
    现在,您可以创建 Clients 即应用程序。
  2. 打开 YourDomain/apps 并继续操作。

它看起来像这样

screenshot1 screenshot2 screenshot1

需要注意的重要事项

我的插件可能包含任何类型的错误和漏洞,如果您发现一个,请在问题标签中报告它。

如果您需要帮助,您可以在 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 tokenAuthorization 头部来访问。

如何获取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_tokenrefresh_tokenJSON 响应,您必须将它们都保存到设备/服务器存储中。

发送请求

现在您已经在用户的设备上有了令牌,您可以发送请求。将其作为带有键 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,它包含有关令牌的所有重要信息。它存储

  1. 用户_id
  2. app/client_id
  3. 作用域
  4. 过期时间。
  5. 访问令牌ID。(可用于从服务器端禁用它或用于跟踪目的)有关如何使用这些内容的示例,请参阅 ApiAuthController 中的 getUserInfo() 函数

不要从授权页面移除 Powered by Coflnet,它必须保持可见。您可以根据需要修改MIT下的一切。