使用Passport基于dynamic路由进行身份validation

我正在用Node.js创build一个API,并且我有一些我想要保护的端点。

为了简单起见,我们假设我为所有端点使用HTTP基本身份validation( passport-http )。

我最想做的就是确保像这样的路由: api.example.com/users/:uid/ : api.example.com/users/:uid/只能由具有该ID的用户访问。

我可以这样做:

 app.get('/users/:uid', passport.authenticate('basic', { session: false }), function (req, res, next) { if (req.params.uid !== user.id) { return next(new Error('Unauthorized')); } return next(); }, function (req, res, next) { // do secret stuff } ); 

但是我想知道是否有办法通过使用Passport本身来添加额外的中间件:

 app.get('/users/:uid', passport.authenticate( ??? ), function (req, res, next) { // do secret stuff } ); 

可能吗? 如果没有,有没有更好的办法?

你可以尝试这样的事情。 一般描述:validation所有在/ users路由下的任何请求都需要validation的请求。 在你的具体路线上,使用一些中间件,确保用户试图访问特定的路由是通过该uid的路由本身。

 function authorizeUser(req, res, next) { if (req.user.uid !== req.params.uid) next(new Error('Not your profile!')); next(); } // Require login for entire /users section app.use('/users', passport.authenticate('basic', { session: false })); // Authorize /users/:uid section to one user app.use('/users/:uid', authorizeUser); // Nested routes will all be secured by the middleware above. app.get('/users/:uid', function (req, res) { // Secret stuff }); app.get('/users/:uid/foo/bar', function (req, res) { // Also secret }); 

如果您只保护一个端点,则可以将其全部放在相同的路线上。