我正在撰写一个网站,除非用户通过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将我的用户重定向到他们最初尝试访问的页面?
我已经看到了使用会话状态的一些建议,但我不想这样做,因为它很笨拙 - 我想象一下,如果用户打开多个标签到网站,并要求登录每个,所有选项卡最终将定向到最后一个试图去的网址。
如果没有会话,有没有办法做到这一点?
答案 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。也许它会有所帮助。