介绍
举个例子:比如你想去公园,这个 token 就相当于门票,你只有拿着这个门票才能进去
一般用在前后端分离开发
一个加密以后的字符串,该字符串可以被反编译
- 反编译就是加完密之后还可以解开
- 只不过这里的解开需要一把钥匙的(key)
执行流程
- 当用户登陆完成之后,服务端会生成一个令牌。并将令牌返回给前端
- 前端得到令牌之后将其保存。
- 当调用敏感的接口时,需要传递token.
- 服务端会对token进行验证。
存储的是什么?
一般存储着个人信息,过期时间
- 等你再次访问比较敏感的接口的时候,把令牌交给服务器端,服务器端对其进行解析,解析完就可以得到令牌当中的 个人信息和过期时间
- 前端得不到 个人信息和过期时间,前端只能得到一个令牌,你对这个令牌不能够解析,只有服务器端可以。
- 前端为什么不可以?因为前端没有秘密可言,像那种比较复杂的算法是不会放在前端的,因为前端右键源码就可以看的到
- 用户每次登录的时候都会生成一个新的令牌
验证的具体流程
- 验证token是否正确
- 正确。
验证token是否过期。
1. 过期:返回过期信息给前端。前端让其自动退出
2. 未过期:继续执行。 - 不正确。返回异常。前端让其自动退出。
- 正确。
token生成以及使用
- 下载模块 JWT–JSON web token
- 在你的服务器端
- 比如你写后端接口的那个地方,在同一个地址里面下载
- cnpm install jwt-simple -S
- 引入
const jwt = require("jwt-simple");
- 生成
jwt.encode(payload,key); //第一个参数是你要荷载的内容 payload
- 一般包含个人信息和过期时间
const key = "sadawidha9dahd"
const token = jwt.encode({
admin:"zhangsan", //个人信息
createTime:Data.now() //生成时间
}
,key);
- 解析
jwt.decode(token,key); //
const info = jwt.decode(token,key); //这个 info 就是你解析的内容,内容就是你荷载的信息
- 在调用私密接口时使用。
如何判断 token 是否过期
- 出在解析这个地方
- 在生成的时候我们生成一个时间
- 那么我使用这个生成时间的话 info.createTime
- 既然知道生成时间,再和当前的时间进行比较
- 当前时间 - createTime = 间隔时间
const info = jwt.decode(token,key); //这个 info 就是你解析的内容,内容就是你荷载的信息
const nowTime= Date.now(); //当前时间
if((nowTime-info.createTime) > 100*60*1000){
console.log("过期啦")
}else{
console.log("正常")