我正在尝试让基本的auth0应用程序运行。我在Auth0仪表板上遵循了节点示例,但我遇到了/login
和/callback
之间的无限重定向循环。我试图使用此repo读数的入门示例简化代码,现在我的路由代码看起来像这样:
app.get('/login',
passport.authenticate('auth0', {scope: 'openid email profile'}),
(req, res) => res.redirect("/")
)
app.get("/callback",
passport.authenticate('auth0', {failureRedirect: '/login'}),
(req, res) => {
if(!req.user) throw new Error("user null")
res.redirect("/")
}
)
关于我的设置的所有内容都遵循我在Auth0仪表板上的说明。
我做了一些挖掘,发现/login
被称为两次,然后称为/callback
两次,然后/登录两次等等。我还发现,如果我给/callback
的Passport.authenticate回调,它将收到以下参数:null, false, {message: "Invalid authorization request state."}
Google搜索"无效授权请求状态"时,没有发现任何有意义的东西。我根据文档做了一切。知道我做错了什么?
我在这些错误上也遇到了同样的问题,是由于kubernetes上的会话损失造成的从3个实例降低到1,然后将其修复。另外,您可以在Auth0Strategy配置state: false
的值中设置,以仔细检查是否可以继续进行。
事实证明,我没有正确设置/callback
路由。这是适当的设置:
router.get("/callback", (req, res, next) => {
passport.authenticate('auth0', (err, user, info) => {
if(err) return next(err)
if(!user) return res.redirect("/failure?info=" + JSON.stringify(info))
req.logIn(user, err => {
if(err) return next(err)
const returnTo = req.session.returnTo
delete req.session.returnTo
res.redirect(returnTo || '/secret')
})
})(req, res, next)
})
res.redirect
应该引导在其他地方,并且需要使用适当的参数来调用req.logIn
对于那些仍有问题的人,问题可能在其他地方。当我遇到这个问题时,事实证明这是由不会持续存在的会话cookie引起的!事实证明,我的反向代理(在Apache上运行(未正确配置。我在这里描述了我的解决方案:https://stackoverflow.com/a/67891167/8221175
至于为什么有兴趣的人可能会发生这种情况,我在此处发布了有关GitHub问题之一的解释:https://github.com/auth0/passport-auth0/sissues/89#issuecomment-856971807
简而言之:登录调用响应中的state
查询参数保存在会话中。如果会话不持续,护照将无法获取state
数据,并且会认为有人在劫持您的会话。这导致"无效的授权请求状态"。消息以及user
在passport.authenticate
回调中是虚假的。如果您的代码然后将其重定向到"/登录",则整个内容会重复,导致无限循环。
修复程序是确保您的饼干得到了正确的保存,并且会话持续存在。您可以使用我在链接中提供的示例。