koa2的Token登录,前后端逻辑

先下载引入jsonwebtoken

const jwt = require('jsonwebtoken');

在进入登录路由的时候生成token,返回给前端

   if (data.username) {
        let payload = {
            userid: data._id,
            name: data.username
        };
        //过期时间,表示秒的数字,或者表示时间跨度的字符串,格式见:// https://github.com/zeit/ms
        let options = {
            expiresIn: '100 days'
        }
        const token = jwt.sign(payload,SECRET_KEY, options);

        ctx.body = new SuccessModel()
        ctx.body.token = token
        return
    }

前端获取到token后,存入cookie中

import Cookies from 'js-cookie'

const TokenKey = 'userToken'

export function getToken() {
  return Cookies.get(TokenKey)
}

export function setToken(token) {
  return Cookies.set(TokenKey, token)
}

每次请求的时候,在请求头中放入token

config.headers['X-Token'] = getToken()

后端编写验证中间件

const Promise = require("bluebird");
const jwt = require("jsonwebtoken");
const verify = Promise.promisify(jwt.verify);
// 签名
const { SECRET_KEY } = require('../utils/cryp')
 
async function tokenCheck(ctx, next) {
  let url = ctx.request.url;
  // 登录 不用检查
  urlArr = ["/api/user/login","/api/user/register"]
  if (urlArr.indexOf(url)!=-1){
    await next();
  } else {
    // 规定token写在header 的 'X-Token' 
    const token = ctx.header['x-token']
    // 解码
    const decodeToken = await verify(token,SECRET_KEY);
    //exp:Expiration time,过期时间
    // iat:Issued at,发行时间
    const { exp, iat } = decodeToken;
    const date = new Date().getTime();
    // 如果过期时间大于现在的时间,则未过期
    if ( exp*1000  > date ) {
        // 未过期
      await next();
    } else {
        //过期
      ctx.body = {
        status: 50014,
        message:'token 已过期'
      };
    }
  }
}
// 50008:非法token;50012:其他客户端已登录;50014:令牌已过期;
module.exports = tokenCheck

在app.js中插入

// 加入检查token中间件,放在路由之前
app.use(tokenCheck)

 

posted @ 2022-02-14 08:42  朱依漾  阅读(362)  评论(0编辑  收藏  举报