【问题标题】:Oauth Password Grant and client websiteOauth 密码授予和客户网站
【发布时间】:2015-07-11 22:22:31
【问题描述】:

我正在使用这些优秀的工具,Laravel 5、thephpleague/oauth2-server、lucadegasperi/oauth2-server-laravel 和 AngularJS。

我有一个域 api.dev 的 api 和授权服务器。

我有一个域为 client.dev 的客户网站。

客户网站有管理员和会员区域。

我正在使用 OAuth 2 资源所有者密码授权类型来访问 api。

现在,我在客户网站管理区域有一个登录表单。用户输入他/她的用户名和密码并提交表单。然后,客户端网站使用密码授权向身份验证服务器发出 post curl 请求,将用户名和密码附加到客户端 ID 和机密等。然后它处理来自身份验证服务器的响应,并在成功时进行相应的重定向(管理仪表板)或不(带有错误消息的登录表单)。

这很好用。

我的问题是,现在,在用户获得访问令牌之前,客户端网站不知道用户是谁(管理员或成员)。当它向 api 请求资源时,我才能使用 Authorizer::getResourceOwnerId() 之类的方法来检查用户是谁。

这是一个如上所述的场景。成员可以登录管理区域,获取访问令牌并被重定向到仪表板。然后一个角度 $http.get 触发以获取要显示在仪表板上的资源(由 oauth 过滤)。客户端网站检查并发现用户实际上不是管理员(通过 Authorizer::getResourceOwnerId()),因此注销并将用户重定向回登录表单。

用户一开始就不应该成功登录。

我的设置错了吗?或者如果不是,我该如何正确处理?

我是否应该在客户端和 api/auth 服务器上都有一个相同的用户表,以便我可以立即检查在客户端登录的用户是否是管理员。

感谢您抽出宝贵时间阅读本文。

【问题讨论】:

  • 为什么不在你的表中添加一列,即。 is_admin 并将其设置为布尔值。当您尝试登录时,请检查是否设置了管理员。

标签: php angularjs authentication laravel oauth


【解决方案1】:

我最终扩展了这两个类和方法:

League\OAuth2\Server\Grant\PasswordGrant::completeFlow() - 我已经包含了要设置的 user_id 并传递给下面的 Bearer 类。

League\OAuth2\Server\TokenType\Bearer::generateResponse() - 检查 user_id 是否存在并将其包含在响应中传递。

当然,现在在 lucadegasperi/oauth2-server-laravel 的配置中使用了子类来代替它们的父类。

基本上,密码授权现在返回此数据:

array (
  'access_token' => 'P9d4ChYm4UGMMqMuuhI250inNiD3NKlIM7cFuVB2',
  'token_type' => 'Bearer',
  'expires_in' => 10,
  'refresh_token' => 'G6WgBEWKakl9vc6jJesFGDUc1wlja8SwuOV7kg8y',
  'user_id' => 2,
)  

【讨论】:

  • 只要确保您的客户无法更改 user_id,否则他们将能够自我宣传。我假设您正在使用签名令牌(也许是 json Web 令牌)来发送授权。
  • 我正在通过 Alex Bilbie 推荐的代理使用 oauth 2 密码授权。这是链接:alexbilbie.com/2014/11/oauth-and-javascript
  • 只要您的授权负载以某种方式签名(即加密的 cookie),那就太好了。我自己会使用授权标头而不是 cookie,但这只是我。您可能会考虑的唯一另一件事是向您的有效负载添加范围(即角色或权限组)。角色='ROLE_ADMIN'。这将允许您的身份验证过程检查一些事情,而无需访问实际用户。它也可以用于客户端来帮助限制可用路由。
  • 是的。我也在使用范围,并且 cookie 是加密的。 user_id 基本上只是让我尽快知道我是否应该让用户继续在仪表板上。客户端不必等待对由 oauth 过滤的资源的请求的响应,只是为了发现用户不是管理员并因此注销并将用户重定向回登录表单。感谢您抽出宝贵时间对此@Cerad 发表评论
猜你喜欢
  • 2014-06-10
  • 2016-06-17
  • 1970-01-01
  • 2020-09-08
  • 2019-08-05
  • 2017-01-10
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
相关资源
最近更新 更多