在passportjs响应之前表达/更改标题

时间:2014-06-08 12:48:17

标签: node.js authentication express passport.js digest-authentication

我正在尝试更改Nodejs中WWW-Authenticate标头中发送的标头质询。

使用passportjs,我当前的服务器代码如下:

router.route('/login/')

    .get(function(req, res){

        if(req.isAuthenticated()) res.redirect('/admin/');
        else res.render('admin/partials/login.html');
    })

    .post(passport.authenticate('digest'));

我面临的问题是摘要授权首先发送401代码响应(这是正常的方式),但大多数浏览器(至少是webkit),启动一个提示popin,要求用户在检测到此类挑战时进行身份验证(标题中的摘要或基本)。

我读到一个解决方案可能是更改标题,修改 例如WWW-Authenticate:DigestWWW-Authenticate:xDigest,但我找不到在Express中执行此操作的方法。

我认为中间件passport.authenticate必须设置标头,在将响应发送到客户端之前我无法找到更改它的方法(我认为在相同的中间件中)。

感谢任何想法。

1 个答案:

答案 0 :(得分:4)

好的,我发现passportjs提供了一种简单的方法来调整响应,就像使用自定义回调一样。

如果它可以帮助任何人,这就是我必须走的路:

router.route('/login/')

    .post(function(req, res, next){

        passport.authenticate('digest', function(err, user, info){

            if(err) return console.log(err);

            if(!user){
                res.set('WWW-Authenticate', 'x'+info);
                return res.send(401);
            }

            req.login(user, function(err){
                if(err) return console.log(err);
                res.redirect('/admin/');
            });
        })(req, res, next);
    });

正如您所看到的,authenticate方法在中间件中调用,而不是作为中间件本身。