json web token
先看写好的
例子
const jwt = require("jsonwebtoken");
//加密字符串
const secretKey = "xixihaha";
// 生成token
module.exports.generateToken = function (payload) {
const token =
jwt.sign(payload, secretKey, {
expiresIn:60*5,//有效时间
});
return "Bearer "+token;//前端写入本地存储,然后写入请求头
};
app.post('/login',async(req,res)=>
{
const {name,password}=req.body
let re=await req.app.locals.db.query(`select password,type from userInf where name='${name}'`)
if(re.recordset[0])
{
if (password==re.recordset[0].password)
{
let admin=false
if(re.recordset[0].type.trim()=='0')
{
admin=true
}
const token = generateToken(
{
name:name,
admin: admin
}
);
res.send({
code: 200,
msg: "注册成功",
data: { token },
});
}
}
})
解释
先看一个jwt
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYWRtaW4iLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNzIwMjY2MTYwLCJleHAiOjE3MjAyNjY0NjB9.wV545vjMchdShO69hUwT3rGa4gu52yDyqQusUU0cUbY
分为四个部分,'Bearer'以及三个'.',三个.内容分别对应header,payload,signature
第一个.的内容 header
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
是对类型和加密算法的base64编码,可以解密
第二个. payload
eyJuYW1lIjoiYWRtaW4iLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNzIwMjY2MTYwLCJleHAiOjE3MjAyNjY0NjB9
放一些有标识性的东西,也是base64编码,可逆,所以不能放密码,前面这里传的就是编码前的paload
const token = generateToken(
{
name:name,
admin: admin
}
);
第三个.signature签名
是对编码后的payload,header,以及secretKey,使用header中说明的加密算法,加密后形成
也就是说签名是对payload,header和secretKey加密形成的
在 JWT 中,Header
和 Payload
是编码,而 Signature
是基于加密的签名。
为什么能确定用户身份
如果对payload内容进行修改,那么当数据来到后端,再次基于header,payload,secretkey加密得到的结果必定与原有token不一致,进一步说明secerkey的重要性,因为在token中header,payload都只是编码,能保证token唯一性的就是secerkey。
如何使用?
在请求头加上"Bearer"+空格+token,也可以是后端返回token时直接返回加上的
return "Bearer "+token;//前端写入本地存储,然后写入请求头
为什么加上"Bearer "?
因为有多种认证方式 Basic 认证、Bearer 认证、OAuth 认证,不同方式处理不一样,需要标识