Passport-auth0 - 无限重定向循环,"Invalid authorization request state."
Passport-auth0 - infinite redirect loop, "Invalid authorization request state."
我正在尝试获取基本的 Auth0 应用程序 运行。我遵循了 Auth0 仪表板上的节点示例,但我 运行 进入了 /login
和 /callback
之间的无限重定向循环。我尝试使用此回购自述文件的入门示例来简化代码,现在我的路由代码如下所示:
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
被调用了两次,然后 /login 被调用了两次,依此类推。我还发现,如果我给 /callback
的 passport.authenticate 一个回调,它会收到这些参数:null, false, {message: "Invalid authorization request state."}
Google 当我搜索短语 "Invalid authorization request state." 时没有发现任何有意义的东西,我根据文档做了所有事情。知道我做错了什么吗?
我遇到了与这些错误相同的问题,是由于 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 上的 运行)配置不正确。我在这里描述了我的解决方案:
至于为什么感兴趣的人会发生这种情况,我已经在此处发布了对 GitHub 问题之一的解释:https://github.com/auth0/passport-auth0/issues/89#issuecomment-856971807
简而言之:登录调用响应中的state
查询参数保存在会话中。如果会话不持续,passport 将无法获取 state
数据,它会认为有人正在劫持您的会话。这会导致“无效授权请求状态”。消息,以及 user
在 passport.authenticate
回调中为假。如果您的代码随后重定向到“/login”,整个过程将重复,导致无限循环。
解决方法是确保正确保存您的 cookie,从而确保您的会话持续存在。您可以使用我在链接中提供的示例。
我正在尝试获取基本的 Auth0 应用程序 运行。我遵循了 Auth0 仪表板上的节点示例,但我 运行 进入了 /login
和 /callback
之间的无限重定向循环。我尝试使用此回购自述文件的入门示例来简化代码,现在我的路由代码如下所示:
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
被调用了两次,然后 /login 被调用了两次,依此类推。我还发现,如果我给 /callback
的 passport.authenticate 一个回调,它会收到这些参数:null, false, {message: "Invalid authorization request state."}
Google 当我搜索短语 "Invalid authorization request state." 时没有发现任何有意义的东西,我根据文档做了所有事情。知道我做错了什么吗?
我遇到了与这些错误相同的问题,是由于 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 上的 运行)配置不正确。我在这里描述了我的解决方案:
至于为什么感兴趣的人会发生这种情况,我已经在此处发布了对 GitHub 问题之一的解释:https://github.com/auth0/passport-auth0/issues/89#issuecomment-856971807
简而言之:登录调用响应中的state
查询参数保存在会话中。如果会话不持续,passport 将无法获取 state
数据,它会认为有人正在劫持您的会话。这会导致“无效授权请求状态”。消息,以及 user
在 passport.authenticate
回调中为假。如果您的代码随后重定向到“/login”,整个过程将重复,导致无限循环。
解决方法是确保正确保存您的 cookie,从而确保您的会话持续存在。您可以使用我在链接中提供的示例。