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:Digest
到WWW-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 未经授权