在不同情况下使用 Passport.js 更改和保存重定向

Posted

技术标签:

【中文标题】在不同情况下使用 Passport.js 更改和保存重定向【英文标题】:Changing and saving a redirect with Passport.js in different circumstances 【发布时间】:2018-03-17 11:49:42 【问题描述】:

我正在编写一个网站,使用 express 和 passport 进行身份验证(以及 mongodb 作为数据库),我知道如何对用户进行身份验证以及如何限制某些页面,以便只有登录用户才能访问它们。但我有一个问题在任何地方都找不到答案:

如果用户尝试访问受限网页并且它注意到用户没有使用 req.isAuthenticated() 登录,它会将用户重定向到登录页面,然后当用户登录时将用户重定向到他们的个人资料页。通常这很好,但在这种情况下,用户试图转到另一个不是个人资料页面的受限页面。

当他/她尝试登录时,我如何将用户重定向到个人资料页面,但当他/她只是尝试访问受限制的页面时,要求他/她登录,然后将他/她重定向到该页面他/她试图访问?

【问题讨论】:

【参考方案1】:

您可以制作类似于下面的自己的中间件来处理该路由上的重定向:

this.ensureAuthenticatedOrSendToLogin = (req, res, next) => 
  if (req.isAuthenticated()) 
    return next();
  
  return res.redirect('/login');
;

然后,您可以向会话添加一个字段,以存储带有来自请求的 url 的 redirectTo:req.session.redirectTo = req.url,并在登录后加载它,然后在身份验证后成功重定向。

您可以使用的简化版本:

this.saveRedirect = (req, res, next) => 
  req.session.redirectTo = req.url; // could pass this in from query too if redirect should be different!
  return next();
;

this.checkRedirect = (req, res, next) => 
  const  redirectTo  = req.session;
  if (redirectTo) 
    const redirect = redirectTo;
    req.session.redirectTo = undefined; // reset session field so its not carried out again if you call this without saving again
    return res.redirect(redirect);
  
  return next();
;

【讨论】:

谢谢你。看起来是一个很好的解决方案。我找到了一个 rly hacky 解决方案(通过在 html 表单中添加不可见字段),但现在看起来很愚蠢:P。我一有机会就试试看。 另外,不要像我所做的那样通过在 html 表单中添加不可见字段...它需要做很多工作,而且它不是一个好的解决方案....

以上是关于在不同情况下使用 Passport.js 更改和保存重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Passport.js 在 Node.js 中重置/更改密码?

Passport.JS 卡在重定向

在集成测试中模拟不同的 passport.js 策略

没有会话的 Passport js 身份验证

通过设置 cookie 使用 Phantom.Js 打开受密码保护的站点 (Passport.js)

关于 passport.js 安全级别的问题