3

我正在将 Express 与 Passport 一起用于 Node.js API 应用程序,我可以通过传递{session:false}来禁用会话passport.authenticate,但是有没有办法可以在一个地方执行此操作,这样我就不会重复 600 次?

var app = express();

app.configure(function() {
    app.use(express.bodyParser());
    app.use(passport.initialize());
});

app.get('/users', passport.authenticate('hash', {session:false}), controllers.users.getAll);
app.get('/users/me', passport.authenticate('hash', {session:false}), controllers.users.getCurrentUser);
// and so on...

如果我能这样做,那就太好了:

app.donotuse(sessions).thanks();
4

3 回答 3

5

只需将结果保存在变量中并重新使用它:

var PassportAuthenticateMiddleware = passport.authenticate('hash', {session:false});
...
app.get('/users',    PassportAuthenticateMiddleware, controllers.users.getAll);
app.get('/users/me', PassportAuthenticateMiddleware, controllers.users.getCurrentUser);

(或者按照@hexacyanide 的建议进行操作,并在全局范围内使用中间件,如果这是您设置中的一个选项)

或者,您可以使用类似的东西:

app.all('/users*',   passport.authenticate('hash', {session:false}));
app.get('/users',    controllers.users.getAll);
app.get('/users/me', controllers.users.getCurrentUser);

这将过滤所有URL 以通过身份验证中间件运行的请求(而不是.all您也可以使用)。.get/users

于 2013-11-03T20:49:03.320 回答
3

身份验证器本身就是中间件。因此,您可以全局分配它。

app.use(express.bodyParser());
app.use(passport.initialize());
app.use(passport.authenticate('hash', {session:false}));
于 2013-11-03T20:48:40.753 回答
1

我猜你有一些需要会话的路线。可以全局设置,但这不适用于您的情况。您可以做的是稍微改进代码:

var controller = function(controller) {
    return function(req, res, next) {
        passport.authenticate('hash', {session:false})(req, res, next);
        controller(req, res, next);
    }
}
app.get('/users', controller(controllers.users.getAll));
app.get('/users/me', controller(controllers.users.getCurrentUser));
于 2013-11-03T20:51:12.010 回答