OAuth2.0协议定义了授权详细流程,并最终以token的形式作为用户授权的凭证下发给客户端,客户端后续可以带着token去请求资源服务器,获取token权限范围内的用户资源。
对于token的描述,OAuth2.0协议只是一笔带过的说它是一个字符串,用于表示特定的权限、生命周期等,但是却没有明确阐述token的生成策略,以及如何去验证一个token。RFC6749对于access token的描述:
The client obtains an access token -- a string denoting a specific scope, lifetime, and other access attributes.
协议不去详细阐述token的生成和验证过程,个人觉得是因为这一块各个业务都有自己的特点,无法完全做到抽象,并且在这一块去做详细的规定,其意义并不大。Token本质上就是对用户授权这一操作在时间和权限范围两个维度上的一个表征,协议可以对token的传递和基本验证做相应规定,但是具体的一个token包含哪些元素,采用什么样的生成算法还是需要由自己去把握。
本文主要讲解自己对于token生成的一些思考,以及介绍两种类型的token:BEARER类型和MAC类型。
一. TOKEN的基本构成
Token表征了用户授权这一操作,授权服务器通过下发token来给客户端颁发获取用户受保护资源的资格,且不会因此而泄露用户的登录凭证信息。Token对于客户端应该是非透明的,客户端只知道这是一个字符串,能够用它来获取用户的受保护资源,对于字符串内部所含的信息应该无从知晓,也不能通过其它方法去解密其中的信息。所以token应该是一类对称加密得到的字符串,并且只有授权服务器持有对称密钥,用于对生成的token进行加密和验证。
对于构成token的元素,各个业务都有自己的需求,不过仍然存在一些基本通用的元素,比如:
clientId:客户端ID,当前token隶属的客户端
userId:用户的ID,表示当前token来自哪个用户授权
scope: 权限范围,该token允许换取的用户受保护资源范围
issueTime: 下发时间,用于控制token的生命周期
tokenType: token的类型,不同类型可能会采用不同的验证措施
以上是我个人根据经验总结的一些基础的token组成元素,具体业务还可以根据具体的需求添加一些其他的元素。
二. Bearer Type Access Token
BEARER类型的token是在RFC6750中定义的一种token类型,OAuth2.0协议RFC6749对其也有所提及,算是对RFC6749的一个补充。BEARER类型token是建立在HTTP/1.1版本之上的token类型,需要TLS(Transport Layer Security)提供安全支持,该协议主要规定了BEARER类型token的客户端请求和服务端验证的具体细节。
2.1 客户端请求
客户端在携带token请求用户的受保护资源时,需要保证token的安全性,以防止token被窃取或篡改,从而损害用户数据安全。BEARER类型token定义了三种token传递策略,客户端在传递token时必须使用其中的一种,且最多一种。
2.1.1 放在Authorization请求首部
Authorization首部说明
Authorization首部是由客户端发送,以向服务器回应自己的身份验证信息,客户端在收到服务器的401 Authent