Oauth2 鉴权逻辑的简要总结

273 阅读1分钟

相关文档

RFC 6749

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

四个角色

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

四个模式

1. 客户端凭证模式 client_credentials

流程

graph LR
subgraph C["客户端(如浏览器)"]
CB[B服务]
end
U[用户] -- 1. 我要访问A资源--> CB
CB --2. 带上凭证请求 token --> AA[A验证服务器]
AA --3. 凭证 OK 返回 token--> CB
CB --4. 带上 token 请求 A 资源 --> RA[A资源服务器]
RA --5. 验证 token--> AA
AA --6. token OK--> RA
RA --7. 返回 A 资源--> CB
  1. 没有校验用户,过程简便
  2. 适用于内部服务间的调用(带个 credential 就在我方内部设施访问自如,除了自己人没谁了)

2. 密码模式 password

流程

graph LR
subgraph C["客户端(如浏览器)"]
CB[B服务]
end
U[用户] --"1. 我要访问A资源(输入账户密码)"--> CB
CB --2. 带上账户密码请求 token --> AA[A验证服务器]
AA --3. 凭证 OK 返回 token--> CB
CB --4. 带上 token 请求 A 资源 --> RA[A资源服务器]
RA --5. 验证 token--> AA
AA --6. token OK--> RA
RA --7. 返回 A 资源--> CB
  1. 有校验用户, 但用户需要在客户端的第三方页面输入 username, password,不安全
  2. 这种模式已在 Spring Security 6 中被弃用

3. 隐式授权模式 implicit

流程

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

4. 授权码模式 authorization_code

流程

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