Node.js 中身份验证后重定向到原始 HTTP 请求(POST)

Node.js 中身份验证后重定向到原始 HTTP 请求(POST)

我有一个使用护照 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 参数存储在全局变量中,因此我可以继续我的操作。

不过还是感谢您的想法......这是值得尝试的。

相关内容