OAuth 2:分离资源服务器和授权服务器

时间:2013-04-26 03:19:24

标签: web-services oauth authorization oauth-2.0 soa

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

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

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

场景#1:登录网络前端

  • 用户提交登录表单
  • web app将凭据POST到auth服务器(grant_type =密码)并接收access_token
  • 网络应用将access_token存储在会话中
  • 每次后续请求:
    • 从资源服务器获取资源(在授权标头中使用access_token)并在Web前端中呈现它
    • 如果我们获得401然后将用户注销(从会话中删除access_token)

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

  • 用户从身份验证服务请求授权
  • 显示允许/拒绝表单
  • 用户被重定向回客户端应用程序并显示授权码
  • 客户端应用程序将代码POST到auth服务(grant_type = authorization_code)并接收access_token
  • client从资源服务器传递资源(带有Auth标头)

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

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

  1. 它将所有用户界面保存在一个应用程序中
  2. 如果用户已登录到网络应用程序,则不会强制用户重新提交其凭据
  3. 以下是方案#2的一种可能替代方案:

    • 用户从网络应用程序请求授权
    • 显示允许/拒绝表单
    • web app POST到auth服务器创建新的授权,返回授权代码
    • 网络应用重定向到存在授权码的客户端应用
    • 客户端应用程序将代码POST到auth服务并接收access_token

    处理此问题的最佳方法是什么?任何一般性意见,建议等都会很棒!

    由于

3 个答案:

答案 0 :(得分:4)

你的备用场景可能就是你想要的:如果你真的想把你的流量分开,你可以尝试这样的事情:

  1. 用户使用grant_type = code
  2. 代表服务请求来自auth服务的授权
  3. auth服务实现用户未登录:使用请求参数重定向到Web应用程序,要求Web服务器重新发送用户。
  4. web app存储请求参数,然后要求输入用户名/密码
  5. web app将凭据POST到auth服务器(grant_type = password)并接收access_token。
  6. 网络应用将access_token存储在会话中
  7. 网络应用会生成一个签名令牌,捕获用户ID并重定向回使用签名令牌作为请求参数的身份验证服务
  8. auth服务解析签名的令牌,提取用户ID,显示允许/拒绝表单
  9. 用户被重定向回客户端应用程序并显示授权码
  10. 客户端应用程序将代码POST到auth服务(grant_type = authorization_code)并接收access_token
  11. client从资源服务器传递资源(带有Auth标头)

答案 1 :(得分:4)

OAauth2框架文档:https://tools.ietf.org/html/rfc6749

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

(B)授权服务器验证客户端并验证         授权授权,如果有效,则发出访问令牌         和刷新令牌。

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

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

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

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

(G)客户端通过身份验证请求新的访问令牌         授权服务器并呈现刷新令牌。该         客户端身份验证要求基于客户端类型         以及授权服务器策略。

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

答案 2 :(得分:0)

[http://alexbilbie.com/guide-to-oauth-2-grants/] [1] 尝试访问此内容也可以使其更加清晰。

如先前的作者所述,仅当您属于[SPA]或移动应用属于第一方时才使用密码授予 就像直接登录gmail一样。 GMAIL是Google页面/应用的一部分,

ii)要从授权服务器获取代码[授权类型=代码],则应从后端进行,而不是从浏览器后端通道通信中进行。

查看OAUTH2 IN ACTION书籍-曼宁出版物,这是迄今为止有关oauth2的最佳文章之一