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 不适用于快速路由器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 保护路由 hasRole,hasAuthority 不适用于 CORS http 请求

注销不适用于 Laravel JWT-auth

JWT 身份验证令牌在非 /api 路由中无效

CORS 标头不适用于 Express 云功能中的特定路由

在快速路由上应用 jwt 而不会引发错误

路由不适用于 React 路由器 v4