使用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 });
如果您只保护一个端点,则可以将其全部放在相同的路线上。
- 坚持使用Node.js后端进行Firebaselogin
- 为restify.js实现基于令牌的身份validation的最佳方式是什么?
- Node.js module.exports护照已authentication到路由
- 我如何使用Passport.js返回到当前散列位置?
- 使用Socket.io,Angular,JWTvalidation数据直到用户validation刷新后才可用
- 没有Passport.js的Google +身份validation
- 使用JWT令牌。 有更好的方法吗?
- 将令牌传递给我的Angular 4应用程序的优雅方式是什么?
- 将未经身份validation的用户redirect到使用node.js和angularjs的默认URL