总的来说,基于token的身份验证原理是用户登录后向服务器提供用户认证信息(如账户和密码),服务器认证完后给客户端返回一个Token令牌,用户再次访问站点其他接口获取信息时,需要带上此令牌。服务端接收到请求后进行Token验证,如果Token不存在或过期,说明请求无效,并拒绝服务。
下面以JWT为例说明token验证的工作原理。
JWT
JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。
首先,在服务器身份验证之后(即客户端通过用户名和密码验证),将生成一个JSON对象并将其发送回用户,为了防止用户篡改数据,服务器将在生成对象时添加签名,一个jwt数据封装示意图如下
![](https://img.haomeiwen.com/i17709149/bff6baff73b22044.png)
其中,JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。
{
"alg":"HS256",
"typ":"JWT"
}
在上面的代码中,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。
有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据(用户信息)。
签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。
HMACSHA256(base64UrlEncode(header)+ "." + base64UrlEncode(payload),
secret)
在计算出签名哈希后,JWT头、有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用"."分隔,就构成整个JWT对象。
然后,客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。
此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。
Authorization: Bearerxxxxxxxxx
当跨域时,也可以将JWT被放置于POST请求的数据主体中。
最后,当服务器收到这个token后,用同样的算法再次计算签名,然后和客户端发过来的签名做比较,如果相等,说明已登录。
![](https://img.haomeiwen.com/i17709149/06664ca421166dc3.png)
JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦JWT签发,在有效期内将会一直有效。此外,token如果被劫持,那么就可以伪造请求和篡改参数,因为JWT本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证,因此为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。
此外,在单点登录架构中,需要每个业务系统都需要保持一样的算法和密钥。
网友评论