如何在重定向Express 4之前找到原始请求路径4
问题描述:
假设我正在尝试访问路径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
中开发了前端。
有人可以帮我吗?
答
我可以想到这种模式的两种常见解决方案。添加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);
});
嘿mattyice,'req.originalUrl'带给我的价值'/ users'和后来我得到了一个TypeError:不能调用方法'空'参数与我试过的第一个解决方案。 – skip 2014-10-29 17:02:45
有趣...所以在我的测试中,originalUrl有散列后缀,所以我不确定这是关于什么。至于“参数”部分,我对护照API并不熟悉,我不得不脱离这里的示例(http://passportjs.org/guide/authenticate/)。我的例子似乎是合法的,但它显然没有传递给你这个请求对象。也许尝试删除第二个参数“{failureRedirect:'/ login',failureFlash:true}”作为测试? – mattr 2014-10-29 17:17:00
我把顶部的中间件'isLoggedIn'移到了顶部,并且我在'/ login?fromUrl ='+ req.originalUrl'获得'req.originalUrl'的哈希部分,但它仍然在控制台上打印了'/ users' 'req.originalUrl'。而我仍然得到我得到'TypeError:不能调用方法'参数'空'错误。删除'{failureRedirect:'/ login',failureFlash:true}'没有任何区别。 – skip 2014-10-29 19:39:24