Token的产生
主要用于web端或者移动端身份验证,可简单理解为“令牌”、“身份证”,有了身份证明,就方便了出入一些隐秘场所的流程。
传统的身份验证是用户端发送账户、密码到服务器,经过加密后与数据库内存储的加密后的账号密码相比较,用户每次登录都要经过一次身份验证,可以说很麻烦。
解决方法就是Session,用户请求登陆时,身份验证成功后,服务器生成一条包含用户身份的记录,然后把该记录ID发给客户端,保存在cookie里。下次再次访问时,携带这条cookie,服务端验证cookie携带信息,如果能查询到ID对应记录,则验证通过,返回请求信息。
主要过程:
- 用户向服务器发送用户名和密码。
- 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
- 服务器向用户返回一个 session_id,写入用户的 Cookie。
- 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
- 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
问题是session要存储在后台,需要定期清理,而且多网站session共享没法实现。
出现问题就要解决啊,token就应运而生,它不需要再服务端存储信息。就像web端打开简书时会自动登录一样。
Token流程
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
Token实现之Json Web Token(JWT)
JWT分为三个部分:
- Header (头部)
- Payload (负载)也可以意译为数据,信息主要体
-
Signature(签名)
完整的JWT为三部分用.相连,就像Header.Payload.Signature,当然各部分数据都是经过操作后组合在一起。
Header:一个json对象,描述jwt的元数据,说明书(需要经过Base64URL编码)
{
"alg":"HS256" //签名算法,默认为HS256,不加密为none
"type":"JWT" //令牌类型,jwt就是jwt
}
Payload:一个json对象,存放实际数据,真正的药方(Base64URL编码)
官方规定了7个官方字段,当然也可以自定义
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
注意:jwt默认不加密,不要存放敏感数据,base64只是起到信息不被直接识别的作用
Signature:对前面两部分的签名,或者说盖章,防止数据被修改,此时需要定义一个密钥secret,保存在服务器端,不需要发送给客户端。
signature形式为
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
//将经过base64url编码后的header和payload用.相连
最后发送到客户端的Token为
base64UrlEncode(header) +"."+base64UrlEncode(payload)+"."+signature
Base64
关于base64也是看token才去百度了一下,原理还是挺简单的,直接贴百度百科吧
原理
转码过程例子:
3 * 8(位)=>4 * 6(位)
计算机内存1个字节占8位,汉字两字节
转前: s 1 3
先转成ascii:对应 115 49 51
2进制: 01110011 00110001 00110011
6个一组(4组) 011100110011000100110011
然后才有后面的 011100 110011 000100 110011
然后计算机是8位8位的存数 6不够,自动就补两个高位0了
所有有了高位补0
科学计算器输入 00011100 00110011 00000100 00110011
得到 28 51 4 51
查对下照表 c z E z
BASE64URL脱胎于base64,有一些小改变
JWT 作为一个令牌(token),有些场合可能会放到 URL(比如api.example.com/?token=xxx)。
Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 Base64URL 算法。
Token练习
在这篇博客中有个小demo可以拿来尝试下token的签发与验证。(Tips:使用博主推荐的安装与签发JWT的功能包jsonwebtoken时,不知到是不是被墙了还是别的原因会缺少一些模块导致程序运行失败,我用的最笨的方法,报错时说少哪个依赖我就安装哪个依赖,最后总会成功的)
参考博客中还有些更详细的信息和链接,有需要自行点击前往。
主要参考博客
- 基于 Token 的身份验证:JSON Web Token(附:Node.js 项目)
- 阮一峰的网络日志JSON Web Token 入门教程
- base64 百度百科
网友评论