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)