token是服务端生成的一串字符串,以做客户端进行请求的令牌,当第一次登录后,服务器生成一个token便将此token返回给客户端,之后客户端只要带上这个token前来请求数据便可,无需再次带上用户名和密码算法
基于token的身份验证api
使用基于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住了用户的验证信息.cookie
2. 安全性session
请求过程当中发送token而再也不发送cookie可以防止csrf(跨站请求伪造).即便在客户端使用了cookie存储token,cookie也仅仅是一个存储机制而不是用于认证,不将信息存储在session中,让咱们少了对session操做,token是有实效的,一段时间以后须要从新验证,咱们也不必定须要等到token自动实效,token有撤回的操做,经过token revocation可使一个特定的token或是一组相同认证的token无效.负载均衡
3. 可扩展性加密
token可以将建立与其余程序共享权限的程序.例如,能将一个随便的社交帐号和本身的大号联系起来.当经过服务登陆(咱们将这个过程Buffer)时,咱们能够将这些buffer附到登陆的数据流上.使用token时, 能够提供可选的权限给第三方应用程序,当用户想让另外一个应用程序访问他们的数据,咱们能够经过创建api,得出特殊权限的tokensspa
4. 多平台跨域
提早先谈论下CORS(跨域资源共享), 对应用程序和服务进行扩展的时候,须要介入各类的设备和应用程序,让咱们的api只提供数据服务,咱们还能够作出设计选择来提供cdn中的资产.这消除了在为应用程序设置快速标头配置后CORS出现的问题,只要用户有一个经过了验证的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是否过时
1.用户登陆校验,校验成功后就返回token给客户端
2. 客户端收到数据后保存在客户端
3. 客户端每次访问api是携带token到服务器端
4. 服务器端采用filter过滤器校验. 校验成功则返回请求数据,校验失败则返回错误码