一,安装包文件
npm i jsonwebtoken
二,通过jsonwebtoken设置token
const jwt = require('jsonwebtoken')
// 创建token
let token = jwt.sign(obj,secret,opt)
//解码token
let payload = jwt.verify(token,secret)
三,实现思路
login
当我们收到前台传来的帐号密码查库比对通过后,创建token并返回客户端
// 登录接口login
router.post('/login', async ctx => {
const { email, password } = ctx.request.body
const findRelut = await User.find({ email })
if (findRelut.length > 0) {
// 验证密码
const result = bcrypt.compareSync(password, findRelut[0].password);
console.log(result);
if (result) {
// 返回token
let payload = { password, time: new Date().getTime(), timeout: 1000 * 60 * 60 * 2 }
let token = jwt.sign(payload, "screct");
ctx.status = 200
ctx.body = {
message: '登录成功',
token: token
}
} else {
ctx.status = 400
ctx.body = {
message: '密码错误重新登录'
}
}
} else {
ctx.status = 404
ctx.body = {
message: '用户不存在,请先注册'
}
}
})
四,如何进行token校验
1.创建checkToken.js文件
const jwt = require('jsonwebtoken')
async function check(ctx, next) {
// split('?')[0]把字符串分割成字符串数组——拿到url值
let url = ctx.url.split('?')[0]
// 如果是登陆页面和注册页面就不需要验证token了
if (url === '/api/users/login' || url === "/api/users/login") {
await next()
} else {
//获取到token
let token = ctx.request.headers["authorization"].spilt('Bearer ')[1]
if (token) {
// 如果有token的话解析
const tokenItem = jwt.verify(token, 'screct')
// 把创建时间和过期时间析构出来
const { time, timeout } = tokenItem
// 拿到当前时间
let NewTime = new Date.getTime()
if (NewTime - time <= timeout) {
// 说明没过期
await next()
} else {
ctx.body = {
status: 405,
message: '请带上token'
}
}
} else {
ctx.body = {
status: 405,
message: 'token 已过期,请重新登陆'
}
}
}
}
module.exports = check
2.参数说明:
iss: 签发者
sub: 面向用户
aud: 接收者
iat(issued at): 签发时间
exp(expires): 过期时间
nbf(not before):不能被接收处理时间,在此之前不能被接收处理
jti:JWT ID为web token提供唯一标识
例如
{"sub":"subject","aud":"sina.com","iss":"baidu.com","iat":1528360628,"nbf":1528360631,"jti":"253e6s5e","exp":1528360637}
3.jwt.sign(object,key)说明
两个参数分别是签名算法和自定义的签名Key(盐)。签名key可以byte[] 、String及Key的形式传入。前两种形式均存入builder的keyBytes属性,后一种形式存入builder的key属性。如果是第二种(及String类型)的key,则将其进行base64解码获得byte[] 。
五、在app.js入口中注用
const checkToken = require('./middleware/checkToken.js')
// 验证token的中间件函数
app.use(checkToken)
本文含有隐藏内容,请 开通VIP 后查看