2014-10-29 81 views
1

假设我正在尝试访问路径http://localhost:3000/users#/WyCrYc28r/foo/1414585518343。 但/users仅需要被认证的用户如下访问路径:如何在重定向Express 4之前找到原始请求路径4

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,因为这是用户想要去的地方。

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

有人可以帮我吗?

回答

2

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

1)的URL保存为重定向URL查询参数

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)(不容易或可扩展)使用您的会话状态来存储从网址。它可能看起来像:

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); 
}); 
+0

嘿mattyice,'req.originalUrl'带给我的价值'/ users'和后来我得到了一个TypeError:不能调用方法'空'参数与我试过的第一个解决方案。 – skip 2014-10-29 17:02:45

+1

有趣...所以在我的测试中,originalUrl有散列后缀,所以我不确定这是关于什么。至于“参数”部分,我对护照API并不熟悉,我不得不脱离这里的示例(http://passportjs.org/guide/authenticate/)。我的例子似乎是合法的,但它显然没有传递给你这个请求对象。也许尝试删除第二个参数“{failureRedirect:'/ login',failureFlash:true}”作为测试? – mattr 2014-10-29 17:17:00

+0

我把顶部的中间件'isLoggedIn'移到了顶部,并且我在'/ login?fromUrl ='+ req.originalUrl'获得'req.originalUrl'的哈希部分,但它仍然在控制台上打印了'/ users' 'req.originalUrl'。而我仍然得到我得到'TypeError:不能调用方法'参数'空'错误。删除'{failureRedirect:'/ login',failureFlash:true}'没有任何区别。 – skip 2014-10-29 19:39:24

相关问题