2013-04-15 64 views
3

我正在尝试使用express在node.js服务器上设置通行证本地身份验证。它似乎应该是非常简单的。但我陷入困境。快速身份验证重定向导致无限循环

这两个片段做工精细在一起:

app.get('/', ensureAuthenticated, function(req, res){ 
    res.redirect('/index.html', { user: req.user }); 
}); 

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login.html', failureFlash: true, successFlash: "Success!" }), 
    function(req, res) { 
    res.redirect('/'); 
}); 

的问题是没有什么让我打字“www.myurl.com/index.html”到地址栏和右侧拖放到我的网页。

如果我使用一个像这样的任何代码:

app.get('/index.html', ensureAuthenticated, function(req, res){ 
    res.redirect('/index.html', { user: req.user }); 
}); 

好像我陷入一个循环......这将是很好,如果它可以检查我的身份验证和送我对我的方式,而不永远检查每个重定向。避免这种情况的方法是什么?

我注意到文档似乎利用.render而不是重定向。但是这个SEEMS要​​求我使用.ejs,我宁愿不这样做。这是必须的吗?

++仅供参考++

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

回答

2

所以我猜你是让express.static()处理请求index.htmllogin.html?在这种情况下,你可以创建index.html的路线,将首先检查认证,并采取相应的行动:

app.get('/index.html', ensureAuthenticated, function(req, res, next) { 
    // if this block is reached, it means the user was authenticated; 
    // pass the request along to the static middleware. 
    next(); 
}); 

请确保您添加express.static到中间件堆栈之前上述航线声明,否则将被绕过(Express中间件/路由按声明顺序调用,第一个与请求相匹配的将处理它)。

编辑:我总是忘记,这是可能的,而且更清洁,太:

app.use('/index.html', ensureAuthenticated); 

(而不是以上app.get

+0

我已经结束了做app.get('/ index.html',ensureAuthenticated);到目前为止它工作正常。是否有理由使用“使用”而不是“获得”? – Jeremythuff

+0

我倾向于将'app.use'用于'真正'中间件,就像我的示例代码中一样。此外,'app.use'将匹配GET以外的请求方法,但在这种情况下,这不是真正的问题。因此,除了语义之外,在这种情况下,没有理由选择另一个:)(编辑:使用'app.get'也可能存在潜在的副作用,因为它由路由器中间件处理,但我不认为他们也会在这里申请) – robertklep

1

你为什么要使用重定向每一个途径吗?所有你需要做的是

app.get('/',ensureAuthenticated,function(req,res){ 

// your route logic goes here 

}); 

的ensureAutheticated会检查你的代码是否已经验证过了。不需要每次通过登录路由重定向它。

res.renderres.redirect()是用于不同目的的不同的东西。

重定向重定向到为res.render() 渲染view.The视图可以通过它,你必须,如果你与快递的最新版本使用什么consolidate.js任何文件supported的路线。

因此,从您的路由中删除所有这些重定向,无限循环应该停止。您只需传递ensureAuthenticated以确保请求已通过身份验证。