一、概述
简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
令牌与密码的区别:
令牌(token)与密码(password)的作用是一样的,都可以进入系统,但是有三点差异。
(1)令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化。
(2)令牌可以被数据所有者撤销,会立即失效。以上例而言,屋主可以随时取消快递员的令牌。密码一般不允许被他人撤销。
(3)令牌有权限范围(scope),比如只能进小区的二号门。对于网络服务来说,只读令牌就比读写令牌更安全。密码一般是完整权限。
上面这些设计,保证了令牌既可以让第三方应用获得权限,同时又随时可控,不会危及系统安全。这就是 OAuth 2.0 的优点。
注意,只要知道了令牌,就能进入系统。系统一般不会再次确认身份,所以令牌必须保密,泄漏令牌与泄漏密码的后果是一样的。 这也是为什么令牌的有效期,一般都设置得很短的原因。
二、令牌授权流程
角色分为:第三方应用、服务、用户。
1.第三方身份备案
第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。
这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。
2.令牌授权
2.1.不需要用户授权的令牌
不需要用户授权的令牌仅需考虑授权权限范围和有效期即可。
a.请求令牌:client ID、client secret、权限类型、有效期(*此请求因携带client secret必须由后端请求,不可暴露给前端)
b.返回令牌:校验secret和权限后生成token令牌,和令牌截止日期一同返回
2.2.需要用户授权的令牌
需要用户授权的令牌除需考虑授权权限范围和有效期以外,还需要增加用户授权环节拿到用户授权码。
a.请求授权码:client ID、权限类型
b.返回授权码:用户同意向此第三方授权指定权限,生成授权码并返回
c.请求令牌:client ID、client secret、权限类型、用户授权码、有效期(*此请求因携带client secret必须由后端请求,不可暴露给前端)
d.返回令牌:校验secret、权限、用户授权后生成token令牌,和令牌截止日期一同返回
3.令牌使用
第三方拿到授权令牌token后,每个发到 API 服务的请求,都必须带有令牌。具体做法一般是在header请求头加上一个Authorization
字段,令牌就放在这个字段里面。
4.令牌更新
令牌的有效期到了,如果让用户重新走一遍令牌授权流程,再申请一个新的令牌,很可能体验不好,而且也没有必要。OAuth 2.0 允许用户自动更新令牌。
具体方法是,服务颁发令牌的时候,一次性颁发两个令牌,一个用于获取数据(token),另一个用于获取新的令牌(refresh token 字段)。令牌接近截止日期前,第三方使用 refresh token 发一个请求,去更新令牌。
a.更新令牌:client ID、client secret、权限类型、refresh token(*此请求因携带client secret必须由后端请求,不可暴露给前端)
b.返回新令牌:校验secret、权限、refresh token后生成token令牌,和新令牌截止日期一同返回
参考:http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html
