在auth(没有会话)后使用passportjs-google重定向到原始页面

时间:2014-07-12 19:57:20

标签: express google-oauth passport.js

我正在撰写一个网站,除非用户通过Google登录(并且他们的电子邮件位于硬编码列表中),否则不应访问其内容。 PassportJS使用像

这样的中间件使这很容易
app.all '*', (req, res, next) ->
    if req.isAuthenticated()
        next()
    else
        passport.authenticate('google')(req, res, next)

如果用户未经过身份验证,他们会被踢到Google进行身份验证 - 到目前为止一直很好。当Google授权用户时,它会将其发送到我的返回网址:

app.get '/auth/google/return', passport.authenticate('google',
    successRedirect: '/'
    failureRedirect: '/login'
)

但是,我不想将用户发回/,我想将其发送到他们试图访问的原始网址。

当我的中间件发现他们未经身份验证并将其踢到Google时,我如何使用passportjs / passport-google将我的用户重定向到他们最初尝试访问的页面?

我已经看到了使用会话状态的一些建议,但我不想这样做,因为它很笨拙 - 我想象一下,如果用户打开多个标签到网站,并要求登录每个,所有选项卡最终将定向到最后一个试图去的网址。

如果没有会话,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以将当前网址(req.originalUrl)存储在req.session中,并通过passport.js策略将用户重定向到/auth/success的网址。 /auth/success重定向到最后一页。 我找不到一个不使用会话的版本。

app.get('/auth/success', function(request, response) {
  response.redirect(request.session.lastUrl || '/');
});

app.get('/auth/google/return', passport.authenticate('google', {
    successRedirect: '/auth/success'
    failureRedirect: '/login'}
));

app.use(function(req, res, next){
    req.session.lastUrl = req.originalUrl;
    if (req.isAuthenticated()) {
        next()
    } else {
        passport.authenticate('google')(req, res, next);
    }
});

答案 1 :(得分:0)

只考虑将URL的查询参数用作重定向路径的存储,例如重定向(/login?origin=${req.path}),或者,可以在successRedirect中指定它们。

同时检查这个答案:Redirecting to previous page after authentication in node.js using passport.js。也许它会有所帮助。

相关问题