Expressjs /在passportjs响应之前更改标题

Posted

技术标签:

【中文标题】Expressjs /在passportjs响应之前更改标题【英文标题】:Expressjs / Change header before passportjs response 【发布时间】:2014-06-08 12:48:17 【问题描述】:

我正在尝试更改 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)会启动提示弹窗,要求用户在检测到此类挑战时进行身份验证(摘要或基本)在标题中。

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

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

感谢您的任何想法。

【问题讨论】:

【参考方案1】:

好的,我只是发现 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 方法是在中间件内部调用的,而不是作为中间件本身调用的。

【讨论】:

以上是关于Expressjs /在passportjs响应之前更改标题的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS ExpressJS PassportJS - 仅用于管理页面

CORS 登录到 expressjs/passportjs 应用程序 401 未经授权

PassportJS 会话混淆了

PassportJS 中的会话如何协同工作

将 AngularJS 与 PassportJS 结合时出现 CORS 问题

使用 CORS 登录 expressjs 应用程序