我正在使用Node.js构建API,并且我有一些我想要保护的端点。
为简单起见,我们假设我对所有终端使用HTTP基本身份验证(passport-http
)。
我最想做的是确保这样的路线: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
}
);
有可能吗?如果没有,有更好的方法吗?
答案 0 :(得分:2)
您可以尝试这样的事情。一般说明:验证在/ users路由下命中任何内容的所有请求都需要身份验证。在您的特定路线上,使用一些中间件,确保尝试访问特定路线的用户是路线本身的用户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
});
如果你只保护一个端点,你可以把它全部放在同一条路线上。