如何在重定向Express 4之前找到原始请求路径

时间:2014-10-29 15:32:48

标签: node.js express authorization httprequest passport.js

让我们说我正在尝试访问路径http://localhost:3000/users#/WyCrYc28r/foo/1414585518343。 但是路径/users只能由经过身份验证的用户访问,如下所示:

  app.get('/users', isLoggedIn, function (req, res) {
      req.session.user = req.user;
      res.cookie('uid', req.session.passport.user)
          .render('users', { title: 'The Foo Machine', user: req.user });
  });

以下是isLoggedIn中间件:

function isLoggedIn(req, res, next) {
  if (req.isAuthenticated())
      return next();
  res.redirect('/login');
}

以下是login的处理方式:

app.post('/login', passport.authenticate('local-login', {
    successRedirect: '/users', 
    failureRedirect: '/login', 
    failureFlash: true 
}));

登录后我被重定向到http://localhost:3000/users,但我希望用户在成功登录后转到http://localhost:3000/users#/WyCrYc28r/foo/1414585518343,因为这是用户想要去的地方。< / p>

我在这里使用PassportJS模块进行身份验证/授权,并在AngularJS中开发了前端。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

我可以想到这种模式的两种常见解决方案。在那里添加angularjs可能会使事情变得复杂,但也许这会让你开始:

1)将网址保存为重定向网址

中的查询参数
function isLoggedIn(req, res, next) {
  if (req.isAuthenticated())
    return next();
  res.redirect('/login?fromUrl='+req.originalUrl);
}

然后在登录后获得该值并进行重定向,例如:

app.post('/login', passport.authenticate('local-login'), { failureRedirect: '/login', failureFlash: true },
  function(req, res) {
    res.redirect(req.param('fromUrl'));
});

2)(不那么简单或可扩展)使用会话状态来存储from-url。它可能看起来像:

function isLoggedIn(req, res, next) {
  if (req.isAuthenticated())
    return next();
  req.session.fromUrl = req.originalUrl;
  res.redirect('/login');
}

然后在登录后获得该值并进行重定向,例如:

app.post('/login', passport.authenticate('local-login'), { failureRedirect: '/login', failureFlash: true },
  function(req, res) {
    res.redirect(req.session.fromUrl);
});