什么是JWT
就是token JWT是一种规范。用来生成一种紧凑安全的token,由三部分组成。
1 Header
header主要是两部分信息
- 声明类型
- 加密算法
数据如下
{
'typ':'JWT',
'alg':'HS256'
}
然后进行base64加密结果如下
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2 payload
payload 是我们token中的有用的信息字段
通常包含三部分
- 公共声明
- 共有声明
- 私有声明
通常不要放敏感信息,因为token在客户端可以解密
{
'typ':'JWT',
'name':‘json’,
‘role’:‘admin’
}
然后老规矩 base64加密得
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
3 secret
第三部分就简单了
// 得到header和payload加密后的组合字段
String str = base64UrlEncode(header)+'.'+base64UrlEncode(payload)
//用header中指定的加密方式进行加密,用‘secret’做盐
String result = HMACSHA256(str,'strect')
得到
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
最终这三个加密完成以后的字符串一拼接,就构成了token
注意 因为token的生成是在服务器端的,生成成功以后返回给客户端。。。这个serect相当于服务端的私钥,,,后期服务端验证token也是基于该serect 所以Serect不能外传的,如果别人拿到了该serect,那么就有可能伪造token。
应用
通常token是加在请求头中的如下并加上Bearer(搬运人)标注。
fetch('api/user/1', {
headers: {
'Authorization': 'Bearer ' + token
}
})
总结:
token是一种身份识别的技术,,客户端在登录以后服务端会生成一个token返回给客户端,客户端后面每次请求带上token,服务端通过token来识别是哪个用户的请求。。所以token的payload中里面最好带有客户端的唯一标识比如userId之类。
吃水不忘挖井人 参考自博客
https://www.jianshu.com/p/576dbf44b2ae