身份验证后使用 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 中使用默认身份验证路由对用户进行身份验证后设置会话数据
成功 IMC 身份验证后 Worklight 身份验证错误 401
成功 NodeJS 身份验证后使用 Nginx 提供静态内容