什么是Token?
用户调用服务器API,向服务器发送的一个可靠的验证信息,用于服务器判断是否为用户
为什么使用Token?
1、传统web验证方式是每次都发送用户名和密码给服务器进行验证,每次都需要发送用户名密码大大增加信息被截获的风险。
2、使用了Token之后,用户在第一次登陆之后服务器可以签发一个令牌,返回给客户端,客户端保存该令牌,在之后登陆中,通过发送令牌进行用户的验证登陆。
Token有何好处?
1、避免重复发送用户名和密码,提高安全性
2、有助于服务器验证请求者的身份,保证了API的访问权限。
目前流行的访问权限认证模式
JWT
该访问权限认证模式中的Token,数据格式为Json形式,以Hash算法生成一个字符串,全称为Json Web Token
Token的组成
1、Header
头部规定了访问权限认证模式和加密方法
{
"typ" : "JWT", (typ:类型)
"alg" : "HS256" (alg:算法,HS256表示哈希算法的mac值。SHA256/HmacSHA256,SHA256表示直接加密,HmacSHA256表示用秘钥进行加密。SHA(Secure) Hash Algorithm ,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码))
}
2、content
内容中包含一些用户的个人信息,下面是一些标准字段
iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间
nbf:Not before
iat:Issued at,发行时间
jti:JWT ID
{
"iss": "ninghao.net",
"exp": "1438955445",
"name": "wanghao",
"admin": true
}
//base64编码结果
eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
Signature
3、sign
sign的加密包括两部分,第一部分是对base64编码的header.content字符串进行加密,第二部分是对密码进行加密,这里的Secret是一个密码,存储在服务器中。
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, 'secret');
//加密结果
SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
综合
生成的Token令牌是header.content.sign
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
之后客户端就会收到这个Token令牌,客户端发送请求携带该令牌就会获取需要的资源