一、前言
JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。
JWT不是一个新鲜的东西,网上相关的介绍已经非常多了。不是很了解的可以在网上搜索一下相关信息。
// /server/api/admin/admin.controller.jsconst jwt = require('jsonwebtoken'); const config = require('../../config/config'); exports.login = async(ctx) => { // ... if (hashedPassword === hashPassword) { // ... // 用户token const userToken = { name: userName, id: results[0].id }; // 签发token const token = jwt.sign(userToken, config.tokenSecret, { expiresIn: '2h' }); // ... } // ...}
2. 添加中间件校验JWT、
// /server/middlreware/tokenError.jsconst jwt = require('jsonwebtoken'); const config = require('../config/config'); const util = require('util'); const verify = util.promisify(jwt.verify); /** * 判断token是否可用 */ module.exports = function () { return async function (ctx, next) { try { // 获取jwt const token = ctx.header.authorization; if (token) { try { // 解密payload,获取用户名和ID let payload = await verify(token.split(' ')[1], config.tokenSecret); ctx.user = { name: payload.name, id: payload.id }; } catch (err) { console.log('token verify fail: ', err) } } await next(); } catch (err) { if (err.status === 401) { ctx.status = 401; ctx.body = { success: 0, message: '认证失败' }; } else { err.status = 404; ctx.body = { success: 0, message: '404' }; } } } }
3. Koa.js中添加JWT处理
此处在开发时需要过滤掉登录接口(login),否则会导致JWT验证永远失败。

