koa-router如何给每个api添加一个基于jwt的token验证的方法?
// valid.js
module.exports = function(req) {
const token = req.headers['x-access-token'];
return jwt.verify(token, PRIMARY_KEY, function (err, decoded) {
if (err) {
return {
success: false,
data: {
code: -101,
message: 'Failed to authenticate token.'
}
}
}
return {
success: true,
}
})
}
// api.js
const tokenValid = require('../tokenValid');
router.post('/api/a', async(ctx, next) => {
const valid = tokenValid(ctx.request);
if (!valid.success) {
ctx.rest(valid.data);
return;
}
// todo
})
如果我有很多个接口,岂不是每个api中都要写一段重复代码。但是如何对async
进行封装,使得每个接口不需要在考虑token,除了登陆和注册。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你需要将你的jwt验证逻辑包装
Promise
,返回true,false中间件,检测登录
路由
router.use() 方法需要指定指定一个路由,且这个路由只能进行完全匹配,eg:
router.use('/api/auth', tokenValid)
只能对api/auth
这个api做token验证。使用了正则做模糊匹配,好像也不行。最后我在api.js 入口文件中,使用了如下代码
这里使用app.use可以获取到每个路由,每个请求。但是呢,这里的
ctx.requst
只能获取到ctx.request.headers
而获取不到ctx.request.body
。这点没想明白,可能和安全有关系吧。之后在前端代码对axios封装的时候,加上
token是登录接口返回的,存在localstorage里面
router.use的path参数是可选的