什么是token?
token是服务端生成的一串字符串,以作客户端进行请求的令牌,当第一次登陆后,服务器生成一个token便将此token返回给客户端,以后客户端只要带上这个token前来请求数据即可,无需再次带上用户名和密码
基于token的身份验证
使用基于token的身份验证方法,在服务端不需要存储用户的登录记录.流程是这样的: 客户端使用用户名跟密码去请求登录,服务度段收到请求,去验证用户名和密码,验证成功后,服务端会签发一个token,再把这个token发送给客户端,客户顿收到token以后可以把它存储起来,比如放在cookie里面或者local storage里面,客户端每次向服务端请求资源的时候需要带上服务端签发的token,服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,以某种方式比如随机生成32位的字符串作为token,存储在服务器中,并返回token到APP,以后APP请求时,凡是需要验证的地方都要带上该token,然后服务端验证token,成功返回所需要的结果,失败返回错误信息, 重新登录,服务器上的token设置一个有效期,每次APP请求时都要验证token和有效期.
token的优势:
1.无状态.可扩展
在客户端存储的token是无状态的,并且能被扩展的.基于这种无状态和不存储session信息,负载均衡器能够将用户的信息从一个服务器传到另一个服务器上.如果将已经验证的信息保存在session中,则每次请求都需要用户向已验证的服务器发送验证信息(称为session亲和性).用户量大时,可会造成一些拥堵.但是不要着急,使用token之后问题就会解决,因为token自己hold住了用户的验证信息.
2. 安全性
请求过程中发送token而不再发送cookie能够防止csrf(跨站请求伪造).即使在客户端使用了cookie存储token,cookie也仅仅是一个存储机制而不是用于认证,不将信息存储在session中,让我们少了对session操作,token是有实效的,一段时间之后需要重新验证,我们也不一定需要等到token自动实效,token有撤回的操作,通过token revocation可以使一个特定的token或是一组相同认证的token无效.
3. 可扩展性
token能够将创建与其他程序共享权限的程序.例如,能将一个随便的社交账号和自己的大号联系起来.当通过服务登录(我们将这个过程Buffer)时,我们可以将这些buffer附到登录的数据流上.使用token时, 可以提供可选的权限给第三方应用程序,当用户想让另一个应用程序访问他们的数据,我们可以通过建立api,得出特殊权限的tokens
4. 多平台跨域
提前先谈论下CORS(跨域资源共享), 对应用程序和服务进行扩展的时候,需要介入各种的设备和应用程序,让我们的api只提供数据服务,我们还可以做出设计选择来提供cdn中的资产.这消除了在为应用程序设置快速标头配置后CORS出现的问题,只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到.
token原理
1. 将荷载payload,以及header信息进行Base64加密,形成密文payload密文,header密文
2. 将形成的密文用句号链接起来,用服务端秘钥进行HS256加密,生成签名
3.将前面的两个密文后面用句号链接签名形成最终的token返回给服务端
注:
(1) 用户请求时携带此token(分为三部分,header密文, payload密文,签名)到服务端,服务端解析第一部分(header密文),用base64解密,可以知道用了什么算法,此处解析发现是HS256
(2). 服务端使用原来的秘钥与密文(header密文+"."+payload密文)同样进行HS256运算,然后用生成的签名与token携带的签名进行比对,若一致说明token合法,不一致说明原文被修改
(3). 判断是否过期,客户端通过用base64解密第二部分(payload密文),可以知道荷载中授权时间,以及有效期.通过这个与当前时间对比发现token是否过期
token实现思路:
1.用户登录校验,校验成功后就返回token给客户端
2. 客户端收到数据后保存在客户端
3. 客户端每次访问api是携带token到服务器端
4. 服务器端采用filter过滤器校验. 校验成功则返回请求数据,校验失败则返回错误码