什么是对 Express 4 路由器上的某些路由进行身份验证的更好方法?

Posted

技术标签:

【中文标题】什么是对 Express 4 路由器上的某些路由进行身份验证的更好方法?【英文标题】:What is a better way to authenticate some of the routes on Express 4 Router? 【发布时间】:2014-10-25 12:17:23 【问题描述】:

我正在使用 Express 4,其中有一条受 passport.js 保护的路线,如下所示:

var media = require('express').Router();

media.get('/', function(req, res) 
    // provide results from db
);

media.post('/', passport.authenticate('bearer'), function(req, res) 
    // This route is auth protected
);

所以 - 获取收集路由(大部分)不应该为我保护,而创建/更新路由应该。但这需要我将护照传递给我的所有路由文件(到目前为止我有 7 个),然后将其作为中间件添加到其中的一些文件中。

我喜欢你可以这样做的版本:

var router = require('./my-router');
app.use('/api/route', passport.authenticate('bearer'));
app.use('/api/route', router);

但这需要对我的所有路线进行身份验证。

有没有比通关护照更好的办法?

【问题讨论】:

【参考方案1】:

您可以将路由器分成受保护/不受保护,并在受保护路由上调用中间件。

var express = require('express'),
    media = express.Router(),
    mediaProtected = express.Router();

media.get('/', function(req, res) 
    // provide results from db
);

mediaProtected.post('/', function(req, res) 
    // This route is auth protected
);

module.exports = 
    protected: mediaProtected,
    unprotected: media
;

然后你就可以了

var router = require('./my-router');
app.use('/api/route', passport.authenticate('bearer'), router.protected);
app.use('/api/route', router.unprotected);

【讨论】:

哇,本,这真的很聪明!我只需要修复那里的命名。 这将是天才,只是当路由路径相同时它不起作用。我已经在 express4、passport 0.3.2 上尝试过同样的实现,并且对身份验证的检查遵循路由路径,而不是路由器实例。在这种情况下,我的所有路线都受到保护。 路由路径相同就不行了,怎么知道你要使用哪一个呢?您定义的第一条路线将优先。 @BenFortune 你的最终解决方案是什么?

以上是关于什么是对 Express 4 路由器上的某些路由进行身份验证的更好方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Express 路由默认需要身份验证?

NodeJS + Express - 将会话中间件应用于某些路由

Express - 使用 axios 返回具有命名路由参数的某些文档

Express.js 中间件为上面定义的路由执行

爱快路由器怎么进后台管理,是192.168.1.1吗?

Express采坑系列之剥离路由