npm i jsonwebtoken
const jwt = require('jsonwebtoken')
// 创建token
let token = jwt.sign(obj,secret,opt)
//解码token
let payload = jwt.verify(token,secret)
当我们收到前台传来的帐号密码查库比对通过后,创建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: '用户不存在,请先注册'
- }
- }
- })
- 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
- 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}
两个参数分别是签名算法和自定义的签名Key(盐)。签名key可以byte[] 、String及Key的形式传入。前两种形式均存入builder的keyBytes属性,后一种形式存入builder的key属性。如果是第二种(及String类型)的key,则将其进行base64解码获得byte[] 。
- const checkToken = require('./middleware/checkToken.js')
-
- // 验证token的中间件函数
-
- app.use(checkToken)