PinkHello
做一个快乐的程序猿
05 OAuth2.0 那点事

OAuth2.0 是什么?

OAuth2.0 Framework RFC 6749 [https://tools.ietf.org/html/rfc6749]

OAuth 就是一种授权机制,它介于客户端与资源所有者的授权层,为了分离不同的角色。 在资源所有者同意并向客户端颁发令牌后,客户端携带令牌可以访问部分或全部资源。

OAuth2.0 是OAuth 协议的一个版本,为2.0版本。有意思的是 2.0 与 1.0 并不兼容。

OAuth2.0 授权方式

获取授权的过程

  • 授权码(authorization-code)
  • 隐藏式(implicit)
  • 密码(password)
  • 客户端凭证(client credentials)

不管哪种方式,都需要在第三方应用申请令牌之前,需要在系统中申请身份唯一标识: 客户端ID Client ID 和 客户端秘钥 Client Secret. 这样能确保Token不被恶意使用。

授权重要的参数和指标:

  • response_type 响应类型: code(要求返回授权码),token(要求返回授权Token)
  • client_id 客户端身份标识
  • client_secret 客户端秘钥
  • redirect_uri 重定向地址
  • scope 授权范围, read 只读权限, all 全部权限
  • grant_type 授权方式 authorization_code(授权码)、password(密码)、client_credentials (凭证)、refresh_token(更新令牌)
  • state 应用程序传递的一个随机数,防止 CSRF 攻击

授权码

在访问第三方应用先申请一个授权码,然后再用授权码获取令牌.这种方式也是最常用的流程,安全性也是最高的,适用于有后端的Web应用。授权码通过前端传送,令牌存储在后端。所有的和资源服务器的交互都在服务端完成,避免了令牌的泄露。 授权码和令牌的在 浏览器和客户端WEB应用以及资源服务器的交互流程大致如下: authorization-code

  • 1.2.3.4 用户选择 Google 登陆 yelp.com
  • 3.4 Yelp.com 请求用户授权 Google 权限
  • 5.6 用户同意后返回授权码
  • 7.8 Yelp.com 通过授权码 会向 Google发起请求Token
  • 9 验证必要参数,返回 Token
  • 10.11 操作请求

隐藏式

implicit

密码式

顾名思议,在自己的系统输入第三方系统的账号密码,自己的系统拿账号密码去申请令牌,响应题里面返回token

凭证式

凭证式和密码很相似,主要给没有前端输入的项目或者命令行

令牌的使用和更新

令牌的使用

令牌的拿到了,就可以调用Google的API进行请求数据了, 一般讲 Token 放入请求头 Authorization.

令牌的更新

Token 是有时效性的,一旦过期就需要重新获取,但是重走一遍授权流程,不仅麻烦而且用户体验也不好,那如何让用户使用的优雅呢?

一般在颁发令牌的时候,颁发两个Token, 一个授权Token,一个Refresh Token, 在更新refresh_token时候,将grant_type指定为refresh_token, 参数refresh_token是用于更新Token的refresh_token

总结

安利

参考


最后修改于 2021-02-10