45

OAuth 2 规范让我相信“资源服务器”和“授权服务器”不一定必须是同一个应用程序,但我正在努力弄清楚这在实践中是如何实现的。

例如,假设存在以下应用程序:

  • 资源服务器
  • 授权服务器
  • 网络前端
  • 第三方客户端应用

场景 #1:登录到 Web 前端

  • 用户提交登录表单
  • Web 应用程序将凭据发布到身份验证服务器 (grant_type=password) 并接收 access_token
  • Web 应用程序将 access_token 存储在会话中
  • 在随后的每个请求中:
    • 从资源服务器获取资源(在 Authorization 标头中带有 access_token)并将其呈现在 Web 前端
    • 如果我们得到 401 然后注销用户(从会话中删除 access_token)

场景#2:授权第三方应用

  • 用户向身份验证服务请求授权
  • 显示允许/拒绝表单
  • 用户被重定向回客户端应用程序并存在授权代码
  • 客户端应用程序将代码发布到身份验证服务 (grant_type=authorization_code) 并接收 access_token
  • 客户端通过资源服务器获取资源(带 Auth 标头)

我无法理解的部分是如何在场景 #2 中显示允许/拒绝表单之前对用户进行身份验证。用户可能已登录到主 Web 应用程序,但身份验证服务对此一无所知,并且会以某种方式需要再次对用户进行身份验证。身份验证服务是否也需要支持登录/会话?

我想知道网络应用负责显示允许/拒绝表单是否更有意义,原因有两个:

  1. 它将所有 UI 保存在一个应用程序中
  2. 如果用户已经登录到 Web 应用程序,则不会强制用户重新提交他或她的凭据

这是场景 #2 的一种可能替代方案:

  • 用户从 Web 应用请求授权
  • 显示允许/拒绝表单
  • Web 应用程序 POST 到身份验证服务器创建新授权,返回授权码
  • Web 应用程序重定向到存在授权代码的客户端应用程序
  • 客户端应用程序将代码发布到身份验证服务并接收 access_token

处理这个问题的最佳方法是什么?任何一般性的评论、建议等都会很棒!

谢谢

4

3 回答 3

9

OAauth2 框架文档:https ://www.rfc-editor.org/rfc/rfc6749

(A) 客户端通过与授权服务器进行身份验证并提供授权许可来请求访问令牌。

(B) 授权服务器对客户端进行身份验证并验证授权授予,如果有效,则颁发访问令牌和刷新令牌。

(C) 客户端通过提供访问令牌向资源服务器发出受保护的资源请求。

(D) 资源服务器验证访问令牌,如果有效,则为请求提供服务。

(E) 重复步骤 (C) 和 (D) 直到访问令牌过期。如果客户端知道访问令牌过期,则跳到步骤(G);否则,它会发出另一个受保护的资源请求。

(F) 由于访问令牌无效,资源服务器返回无效令牌错误。

(G) 客户端通过与授权服务器进行身份验证并提供刷新令牌来请求新的访问令牌。客户端身份验证要求基于客户端类型和授权服务器策略。

(H) 授权服务器对客户端进行身份验证并验证刷新令牌,如果有效,则发出新的访问令牌(以及,可选地,新的刷新令牌)。

于 2017-10-14T08:20:12.680 回答
5

您的替代方案可能是您想要使用的:如果您真的想将流分开,您可以尝试这样的事情:

  1. 用户代表授权服务向授权服务请求授权,授权类型=代码
  2. auth 服务实现用户未登录:使用请求参数重定向到 Web 应用程序,要求 Web 服务器将用户发送回。
  3. Web 应用程序存储请求参数,然后询问用户名/密码
  4. Web 应用程序将凭据发布到身份验证服务器 (grant_type=password) 并接收 access_token。
  5. Web 应用程序将 access_token 存储在会话中
  6. Web 应用程序生成一个捕获用户 ID 的签名令牌,并使用签名令牌作为请求参数重定向回身份验证服务
  7. auth 服务解析签名令牌,提取用户 ID,显示允许/拒绝表单
  8. 用户被重定向回客户端应用程序并存在授权代码
  9. 客户端应用程序将代码发布到身份验证服务 (grant_type=authorization_code) 并接收 access_token
  10. 客户端通过资源服务器获取资源(带 Auth 标头)
于 2013-04-26T04:02:32.660 回答
1

[http://alexbilbie.com/guide-to-oauth-2-grants/][1] 也可以尝试访问这个以获得更清晰的信息。

正如前面的作者所说,只有当您属于 [SPA] 或移动应用属于第一方时才使用密码授权,例如直接登录到 gmail。GMAIL 是谷歌页面/应用程序的一部分,

ii) 从授权服务器获取代码 [granttype=code] 的令牌应该从后端发生,而不是从浏览器后端通道通信]

查看 OAUTH2 IN ACTION 书 - Manning 出版物,迄今为止关于 oauth2 的最佳文章之一

于 2020-11-13T16:04:06.550 回答