Passport-auth0 - 无限重定向循环,"Invalid authorization request state."



我正在尝试让基本的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数据,并且会认为有人在劫持您的会话。这导致"无效的授权请求状态"。消息以及userpassport.authenticate回调中是虚假的。如果您的代码然后将其重定向到"/登录",则整个内容会重复,导致无限循环。

修复程序是确保您的饼干得到了正确的保存,并且会话持续存在。您可以使用我在链接中提供的示例。

相关内容

最新更新