使用Passport基于动态路由进行身份验证

时间:2014-10-18 20:42:11

标签: node.js authentication express passport.js

我正在使用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
    }

);

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

1 个答案:

答案 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
});

如果你只保护一个端点,你可以把它全部放在同一条路线上。