【发布时间】:2013-04-20 03:23:12
【问题描述】:
OAuth 2 规范让我相信“资源服务器”和“授权服务器”不一定是同一个应用程序,但我很难弄清楚这在实践中是如何实现的。
例如,假设存在以下应用:
- 资源服务器
- 授权服务器
- 网络前端
- 第三方客户端应用
场景 #1:登录到 Web 前端
- 用户提交登录表单
- Web 应用将凭据 POST 到身份验证服务器 (grant_type=password) 并接收 access_token
- 网络应用程序将 access_token 存储在会话中
- 在每个后续请求中:
- 从资源服务器获取资源(在 Authorization 标头中带有 access_token)并在 Web 前端呈现它
- 如果我们收到 401,则将用户注销(从会话中删除 access_token)
场景 #2:授权第三方应用
- 用户向身份验证服务请求授权
- 显示允许/拒绝表单
- 用户被重定向回客户端应用,授权码存在
- 客户端应用 POST 代码到身份验证服务 (grant_type=authorization_code) 并接收 access_token
- 客户端通过资源服务器获取资源(带 Auth 标头)
我无法理解的部分是如何在场景 #2 中显示允许/拒绝表单之前对用户进行身份验证。用户可能已登录到主 Web 应用程序,但身份验证服务对此一无所知,并且会以某种方式需要再次对用户进行身份验证。 auth 服务是否也需要支持登录/会话?
我想知道由网络应用负责显示允许/拒绝表单是否更有意义,原因有两个:
- 它将所有 UI 保存在一个应用中
- 不会强制用户在已登录网络应用程序的情况下重新提交其凭据
这是场景 #2 的一种可能替代方案:
- 用户从网络应用请求授权
- 显示允许/拒绝表单
- Web 应用 POST 到身份验证服务器创建新授权,返回授权代码
- Web 应用重定向到存在授权码的客户端应用
- 客户端应用 POST 代码到身份验证服务并接收 access_token
处理此问题的最佳方法是什么?任何一般的 cmets、建议等都会很棒!
谢谢
【问题讨论】:
标签: web-services oauth authorization oauth-2.0 soa