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 应用程序,但身份验证服务对此一无所知,并且会以某种方式需要再次对用户进行身份验证。身份验证服务是否也需要支持登录/会话?
我想知道网络应用负责显示允许/拒绝表单是否更有意义,原因有两个:
- 它将所有 UI 保存在一个应用程序中
- 如果用户已经登录到 Web 应用程序,则不会强制用户重新提交他或她的凭据
这是场景 #2 的一种可能替代方案:
- 用户从 Web 应用请求授权
- 显示允许/拒绝表单
- Web 应用程序 POST 到身份验证服务器创建新授权,返回授权码
- Web 应用程序重定向到存在授权代码的客户端应用程序
- 客户端应用程序将代码发布到身份验证服务并接收 access_token
处理这个问题的最佳方法是什么?任何一般性的评论、建议等都会很棒!
谢谢