我有一个使用护照 openId 连接策略进行身份验证的 node.js 代码。身份验证后,它会重定向回原始 URL,但是,如果我在会话过期时使用 POST 提交表单,则它不会以 POST 操作重定向回原始 URL,而是将其更改为 GET 请求。
我想知道,是否有任何可能的方法,我可以在其中存储请求类型并在身份验证后执行相同的操作。
我的 app.js 代码如下所示:
app.get('/login', passport.authenticate('openidconnect', {}));
function ensureAuthenticated(req, res, next) {
if (!req.isAuthenticated()) {
req.session.originalUrl = req.originalUrl;
res.redirect('/login');
} else {
return next();
}
}
app.get('/auth/sso/callback',function(req, res, next) {
var redirect_url = req.session.originalUrl;
passport.authenticate('openidconnect', {
successRedirect: redirect_url,
failureRedirect: '/failure',
})(req,res,next);
});
PS:身份验证和其他常规重定向工作正常......问题仅出在 POST 表单提交上。
答案1
这里的问题是,当执行原始 POST 请求时,它(可能)有一个包含 post 数据的主体。检查ensureAuthenticated
重定向到登录页面,从而丢失了所述 post 数据!
身份验证成功后,当您重定向到原始 URL 时,无法知道要通过 POST 请求发送什么后期数据。
我能想到的一种方法是跟踪最后使用的 GET 请求 URL,将其存储在会话中,并在“登录后重定向”中使用该 URL,从而返回提交 POST 请求之前的页面。这意味着,是的,不幸的是,您的用户必须再次填写表单(因为您必须“重建”以某种方式丢失的帖子数据)。
您可以通过use
在应用程序早期添加处理程序来实现此目的,如果请求的类型为 GET,则该处理程序会将 URL 存储在会话对象中。我会为您提供一个代码片段,但不幸的是我在度假时使用手机,所以恐怕这可能有点困难,很抱歉 :(
答案2
我找到了一个解决方法。我现在做的是,首先将 POST 参数存储在全局变量中,然后调用 EnsuredAuthentication 函数。
在 EnsuredAuthentication 函数之后,它会以 GET 请求的形式重定向到原始 Url,但由于我已将 Post 参数存储在全局变量中,因此我可以继续我的操作。
不过还是感谢您的想法......这是值得尝试的。