理解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 请求用户数据。