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

Express 验证后使用passportjs google重定向到原始页面(无会话),express,google-oauth,passport.js,Express,Google Oauth,Passport.js,我正在写一个网站,除非用户通过谷歌登录(他们的电子邮件在硬编码列表中),否则不应访问该网站的内容。PassportJS使用中间件(如 app.all '*', (req, res, next) -> if req.isAuthenticated() next() else passport.authenticate('google')(req, res, next) 如果用户没有经过身份验证,他们将被转到谷歌进行身份验证——目前为止还不错。

我正在写一个网站,除非用户通过谷歌登录(他们的电子邮件在硬编码列表中),否则不应访问该网站的内容。PassportJS使用中间件(如

app.all '*', (req, res, next) ->
    if req.isAuthenticated()
        next()
    else
        passport.authenticate('google')(req, res, next)
如果用户没有经过身份验证,他们将被转到谷歌进行身份验证——目前为止还不错。当Google对用户进行身份验证时,它会将用户发送到我的返回url:

app.get '/auth/google/return', passport.authenticate('google',
    successRedirect: '/'
    failureRedirect: '/login'
)
但是,我不想将我的用户发送回
/
,我想将他们发送到他们试图访问的原始url

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

我已经看到了一些使用会话状态的建议,但我不想这样做,因为这很简单--我可以想象,如果用户打开多个选项卡访问站点,并要求每个选项卡登录,那么所有的选项卡都会指向上一个试图访问的url


有没有办法在没有会话的情况下执行此操作?

您可以将当前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);
    }
});

只考虑将URL的查询参数用作重定向路径的存储,比如重定向(<代码>登录名> ${Req.PATH} /COD>),或者,在RealReDebug中指定它们。


请检查以下答案:。可能会有帮助。

我特别不想使用sessionspassport.js使用sessions,所以您可能必须使用它。如果您担心,会话存储可能是单点故障,您可以通过加密Cookie使用会话存储会话对于passportjs使用它们的目的很好:保存登录状态,这基本上是用户会话的一个属性。使用会话找出用户路由的位置是一种反模式,因为它会在url中封装整个路由时添加状态。我们还可以看到,如果用户的浏览器cookie不存在或已被禁用,或者在我前面的示例中,用户有多个打开到网站的选项卡,每个选项卡用于不同的url,每个选项卡请求登录,那么它将失败。难道你不能让Google将用户重定向到原始url并进行检查(是否失败或成功)那里或者在查询参数中将用户踢到Google时,您不能包含原始URL吗?(我认为GoogleOAuth有一个“state”参数,您可以使用它)