身份验证后使用 passportjs-google 重定向到原始页面(无会话)

Posted

技术标签:

【中文标题】身份验证后使用 passportjs-google 重定向到原始页面(无会话)【英文标题】:Redirect to original page with passportjs-google after auth (without sessions) 【发布时间】:2014-09-03 04:54:33 【问题描述】:

我正在编写一个网站,其内容不应被访问,除非用户已通过 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 将我的用户重定向到他们最初尝试访问的页面?

我看到了一些使用会话状态的建议,但我不想这样做,因为它很笨拙——我想如果用户打开站点的多个选项卡并被要求在每个选项卡上登录,所有标签最终会指向最后一个试图访问的 url。

有没有办法在没有会话的情况下做到这一点?

【问题讨论】:

【参考方案1】:

您可以将当前的url(req.originalUrl)存储在req.session中,并通过passport.js策略将用户重定向到/auth/success的url。 /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);
    
);

【讨论】:

我特别不想使用会话 passport.js 使用会话,所以可能你必须使用它。如果您担心会话存储可能是单点故障,您可以通过加密 cookie 使用会话存储senchalabs.org/connect/cookieSession.html Sessions 适用于 passportjs 的用途:保存登录状态,这基本上是用户会话的一个属性。使用会话来确定将用户路由到哪里是一种反模式,因为当整个路由应该封装在 url 中时,它会添加状态。我们还可以看到,如果用户的浏览器 cookie 不存在或已被禁用,或者在我之前的示例中,用户有多个打开网站的选项卡,每个选项卡都有不同的 url,并且每个请求登录,它都会失败。 您不能让 Google 将您的用户重定向到原始 URL 并在那里进行检查(无论是失败还是成功)?或者您不能在查询参数中将用户踢到 Google 时包含原始 URL 吗? (我认为 Google OAuth 有一个“状态”参数可供您使用)【参考方案2】:

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

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

【讨论】:

以上是关于身份验证后使用 passportjs-google 重定向到原始页面(无会话)的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.2 中使用默认身份验证路由对用户进行身份验证后设置会话数据

React Router - 身份验证后重定向延迟

成功 IMC 身份验证后 Worklight 身份验证错误 401

成功 NodeJS 身份验证后使用 Nginx 提供静态内容

在向 Twitter/Facebook 进行身份验证后向 Spring Security 进行身份验证

Django 基于状态的多重身份验证后端