1:客户端通过用户名和密码登录
2:服务器验证用户名和密码,若通过,生成token返回给客户端。
3:客户端收到token后以后每次请求的时候都带上这个token,相当于一个令牌,表示我有权限访问了
4:服务器接收(通常在拦截器中实现)到该token,然后验证该token的合法性。若该token合法,则通过请求,若token不合法或者过期,返回请求401请求失败。
1.token相比于session,它无需保存在服务器,不占用服务器内存开销。
2.token可以在服务器集群中很好的使用:无状态、可拓展性强
3.服务器生成的token如下:分为3部分,以点来分割;
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiaHVzaGl3ZWk1MjAiLCJpZCI6NDYsImlhdCI6MTU5MTM0MDQyNiwiZXhwIjoxNTkxMzQ3NjI2fQ.B-NAeiQPk0iiJRHkBJnodVadUlDXBabXrAyTomVxcww
第一部分:token头部
头部(Header),格式如下:
{
“typ”: “JWT”,
“alg”: “HS256”
}
token使用HS256加密算法,将头部使用Base64编码可得到:‘eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9’
第二部分:paload: 存放自定义信息;预定义信息有如下几个;它的编码:‘eyJuYW1lIjoiaHVzaGl3ZWk1MjAiLCJpZCI6NDYsImlhdCI6MTU5MTM0MDQyNiwiZXhwIjoxNTkxMzQ3NjI2fQ’
iss:该JWT的签发者
sub:该JWT所面向的用户
aud:接受该JWT的一方
exp(expires):什么时候过期,这里是一个Unix时间戳
iat(issued at):在什么时候签发
第三部分,签名部分;前两部分都是明文;它的编码:‘B-NAeiQPk0iiJRHkBJnodVadUlDXBabXrAyTomVxcww’
4.通过这个网站来解码,网站地址:https://jwt.io/
5.koa中的代码签发token如下:
// 用户名密码正确后,签发token
const token = jwt.sign({
name: TextRow[0].username,
id: TextRow[0].id
},"sometokens", {expiresIn: '2h'});
resData = {
info: "用户名密码正确",
status: 0,
token: token
}