【问题标题】:Is node passport custom callback as middleware possible for express routes?节点护照自定义回调是否可以作为快速路由的中间件?
【发布时间】:2016-06-29 02:05:01
【问题描述】:

我正在使用 node.js 创建一个简单的 Rest Api,并使用 jwt 令牌保护它,我已经设置了 passport 和 passport-jwt 来验证哪个工作正常,如果 jwt 令牌有错误或它不存在,护照将发送 401 和“未经授权”的正文。我知道如何更改路由的错误以通过执行以下操作发回我想要的自定义错误消息;

router.route('/test')
    .put(function(req, res, next) {
    passport.authenticate('jwt', { session: false }, function(err, user, info) {
        if (err) { return next(err); }
        if (!user) { return res.send("Custom Unauthorised").end();  }
        return res.send("Test Route Accessed").end();
    })(req, res, next);
});

我有大约 20 条路线,我将它们命名为类似于以下内容;

router.route('/books/:id/authors').get(passport.authenticate('jwt', { session: false }), myRoutes.books.authors);

现在您会注意到我将资源特定的路由存储在他们自己的文件(即 myRoutes.books)中,所以我的问题是,有没有一种方法可以将自定义回调作为不需要对路由文件进行重大重组的中间件?

干杯

【问题讨论】:

    标签: node.js express passport.js jwt


    【解决方案1】:

    希望我正确理解了您的问题。

    创建一个函数,我们称之为 jwt

    function jwt (req, res, next){
        passport.authenticate('jwt', { session: false }, function(err, user, info) { 
            if (err) { return next(err); } 
            if (!user) { return res.send("Custom Unauthorised").end(); } 
            // edit as per comment
            //return res.send("Test Route Accessed").end();
            req.user = user;   // Forward user information to the next middleware
            next();
        })(req, res, next);
    }
    

    并将其用作中间件

    router.get('/bla', jwt, handleBla);
    

    【讨论】:

    • 甜,按我的需要工作,只是一个菜鸟,顺便说一句,在 jwt 函数中,您需要删除返回并替换为 next() 调用,它会进入路线:) 干杯
    • 护照填充的 req.user 存在问题,在 'jwt' 未定义后被传递到路由 'handleBla' 而如果您只使用 passport.authenticate('jwt', { session : false }) 它确实被传递了,有什么想法吗?
    • 有什么问题?用户没有填充吗?
    • 它在上面的函数中填充,但下一个中间件(路由)是未定义的。
    • 如果不是像 req.user = user 那样简单地添加它;就在 next() 的上方
    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2017-07-06
    • 2013-03-08
    相关资源
    最近更新 更多