相关文档

RFC 6749

以下总结不涉及官话,均为个人理解。

四个角色

  • 用户(资源拥有者)
  • 客户端(严格讲应该理解为客户端上的某个前端服务)
  • 授权服务器(一般和资源服务器是同属一家)
  • 资源服务器(目标资源所在的地方)

四个模式

1. 客户端凭证模式 client_credentials

流程

客户端(如浏览器)1. 我要访问A资源2. 带上凭证请求 token3. 凭证 OK 返回 token4. 带上 token 请求 A 资源5. 验证 token6. token OK7. 返回 A 资源B服务用户A验证服务器A资源服务器
  1. 没有校验用户,过程简便
  2. 适用于内部服务间的调用(带个 credential 就在我方内部设施访问自如,除了自己人没谁了)

2. 密码模式 password

流程

客户端(如浏览器)1. 我要访问A资源(输入账户密码)2. 带上账户密码请求 token3. 凭证 OK 返回 token4. 带上 token 请求 A 资源5. 验证 token6. token OK7. 返回 A 资源B服务用户A验证服务器A资源服务器
  1. 有校验用户, 但用户需要在客户端的第三方页面输入 username, password,不安全
  2. 这种模式已在 Spring Security 6 中被弃用

3. 隐式授权模式 implicit

流程

客户端(如浏览器)1. 我要访问A资源2. 我 tm 直接访问3. 没权限滚去验证, 重定向4. 甩出验证页面5. 乖乖登录验证6. 验证结果7. 验证成功返回 token8. 来了来了, 我有 token9. 校验 token10. 校验通过11. 返回A资源B服务A验证界面用户A资源服务器A验证服务器
  1. 有校验用户,且是在验证服务器提供的页面做校验,没有暴露给第三方
  2. token 因为存在客户端所以有泄露风险
  3. 这种模式适用于只运行在客户端,没有后端的服务
  4. 出于安全考虑,OAuth 2.0 规范在2019年更新中不再推荐使用 Implicit 模式,新版 Spring Security 中也不再显式支持

4. 授权码模式 authorization_code

流程

客户端(如浏览器)1. 我要访问A资源2. 请求A资源3. 我 tm 直接访问4. 没权限, 滚去验证, 重定向5. 甩出页面6. 乖乖登录验证7. 验证8. 验证成功返回 authorization_code9. authorization_code + secret10. 校验通过, 返回 token11. 带着 token12. 返回A资源13. 返回A资源B服务A验证界面用户B服务器A资源服务器A验证服务器
  1. 有校验用户,且是在验证服务器提供的页面做校验,没有暴露给第三方
  2. 客户端只与服务后端通信,不存任何 A 相关的敏感信息,所有敏感信息都在服务端,相对安全
  3. 应用广泛,可以用于第三方,也可以用在第一方