在使用 koa-jwt 的时候要进行 Token 的身份认证,处理 UnauthorizedError 错误,所以要添加中间件,但是 koa2 的处理 jwt 创建错误的中间件与 express 不同
express 处理中间件:
// 导入 express 模块
const express = require("express");
//一定要在路由之前配置解析Token的中间件
const expressJWT = require("express-jwt");
// 导入配置文件
const config = require("./config");
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证(这里需要注意,secret必须配置algorithms属性)
app.use(
expressJWT({ secret: config.jwtSecretKey, algorithms: ["HS256"] }).unless({
path: [/^\/api\//]
})
);
// 身份认证错误中间件
app.use(function (err, req, res, next) {
// 捕获身份认证失败的错误
if (err.name === "UnauthorizedError") {
return res.cc("身份认证失败!");
} else {
// 未知错误...
res.cc(err);
}
});
// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(3000, function () {
console.log("api server running at http://127.0.0.1:3000");
});
express 错误处理中间件是放在 app.use(expressJWT.... 后面的 但是 koa2 确不同,因为我习惯了 express 所以使用 koa2 的时候出现了错误,koa2 应该把错误处理中间件放在前面
const Koa = require("koa");
const app = new Koa();
// 导入配置文件
const { TOKEN_CONF } = require("./config/index");
//一定要在路由之前配置解析Token的中间件
const koaJWT = require("koa-jwt");
// 身份认证错误中间件
app.use(async (ctx, next) => {
return next().catch(err => {
if (err.status === 401) {
// 自定义返回结果
ctx.status = 401;
console.log(err.name);
ctx.body = {
code: 401,
msg: err.message
};
} else {
throw err;
}
});
});
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证(这里需要注意,secret必须配置algorithms属性)
app.use(
koaJWT({ secret: TOKEN_CONF.jwtSecretKey, algorithms: ["HS256"] }).unless({
path: [/^\/api\//]
})
);
module.exports = app;