理解OAuth

概念

OAuth 是一个关于授权的开放网络标准,目前版本为2.0,用来授权第三方应用,获取用户数据。简单来说就是给第三方令牌的过程

OAuth流程

数据所有者告诉系统,统一授权第三方应用进入系统,获取这些数据。系统产生一个短期的进入令牌,用来替代密码,供第三方使用

  • 令牌与密码的对比
    • 令牌是短期的,到期会自动生效
    • 令牌可以被数据所有者撤销,会立即生效
    • 令牌有权限范围

OAuth2.0

  • 标准文件
  • OAuth2.0有四种获得令牌的流程
    • 授权码
      • 最常用,安全性最高
        授权码
    • 隐藏式
      • 适用于纯前端应用
      • 由于存在无后端的纯前端应用,故有隐藏式的一种方式,其实就是授权码的一种简化版,去掉code的过程,直接返回令牌
      • 注意: 令牌的位置是 URL 锚点(fragment),而不是查询字符串(querystring),这是因为 OAuth 2.0 允许跳转网址是 HTTP 协议,因此存在”中间人攻击”的风险,而浏览器跳转时,锚点不会发到服务器,就减少了泄漏令牌的风险。
    • 密码式
      • 适用于高度信任某个应用
      • A网站要求用户提供B网站的账号密码,然后直接获取令牌
      • 这时不需要跳转,而是把令牌放在 JSON 数据里面,作为 HTTP 回应,A 因此拿到令牌。
    • 凭证式
      • 适用于没有前端的命令行应用,即在命令行下请求令牌。
      • 发送凭证,直接获取令牌
  • 令牌的使用
    • 请求头添加 Authorization,每次请求都需要
  • 更新令牌
    • B 网站颁发令牌的时候,一次性颁发两个令牌,一个用于获取数据,另一个用于获取新的令牌(refresh token 字段)。令牌到期前,用户使用 refresh token 发一个请求,去更新令牌
    • B 网站验证通过以后,就会颁发新的令牌。

demo

1
2
3
4
5
6
A 网站让用户跳转到 GitHub。
GitHub 要求用户登录,然后询问"A 网站要求获得 xx 权限,你是否同意?"
用户同意,GitHub 就会重定向回 A 网站,同时发回一个授权码。
A 网站使用授权码,向 GitHub 请求令牌。
GitHub 返回令牌.
A 网站使用令牌,向 GitHub 请求用户数据。