JWT 不适用于快速路由器
Posted
技术标签:
【中文标题】JWT 不适用于快速路由器【英文标题】:JWT not working with express router 【发布时间】:2018-11-19 20:14:12 【问题描述】:我正在尝试为 express REST API 实现一个身份验证系统。
我从教程中获得了使用 jsonwebtoken 的代码。
我的身份验证中间件 verifyToken
不工作。请帮忙。
var express = require('express');
var router = express.Router();
var jwt = require('jsonwebtoken');
var models = require('../models');
function verifyToken(req, res, next)
var bearerHeader = req.headers['authorization'];
if (typeof bearerHeader !== undefined)
else
res.sendStatus(403)
router.post('/tryjwt', verifyToken, (req, res, next) =>
res.send('It worked');
);
router.get('/login', function (req, res, next)
const user =
id: 1,
usename: 'ayoob',
email: 'ayoob@gmail.com'
jwt.sign( user: user , 'secretkey', (err, token) =>
res.json( token: token )
);
);
module.exports = router;
【问题讨论】:
【参考方案1】:当if (typeof bearerHeader !== undefined)
为真时,您没有执行任何操作。
确保调用next
,以便当前中间件可以将控制权传递给下一个中间件
把这段代码 sn-p 放在 if 语句中
try
const decode = jwt.verify(bearerHeader, 'secretkey')
//do something with the decode object
next()
catch(err)
res.sendStatus(403)
【讨论】:
【参考方案2】:我认为问题在于 jwt.sign() 函数的异步性质 - 它在继续执行代码的同时继续对令牌进行签名 - 返回一个空的 json。你需要在 res.json(token) 之前等待 jwt.sign() 完成,或者在 jwt 的魔力发生时做一些事情。
希望我能帮上忙 :)
附言使用 Promise 是更好的做法,这样您的代码会更干净,不会陷入回调地狱,并且可以更好地处理错误。
【讨论】:
我正在慢慢学习异步编程。谢谢你的提示。以上是关于JWT 不适用于快速路由器的主要内容,如果未能解决你的问题,请参考以下文章