【问题标题】:Passport-auth0 - infinite redirect loop, "Invalid authorization request state."Passport-auth0 - 无限重定向循环,“无效的授权请求状态”。
【发布时间】:2019-12-09 13:25:22
【问题描述】:

我正在尝试运行一个基本的 Auth0 应用程序。我按照 Auth0 仪表板上的 Node 示例进行操作,但在 /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 被调用了两次,然后 /login 被调用了两次,依此类推。我还发现,如果我给/callback 的passport.authenticate 一个回调,它会收到这些参数:null, false, {message: "Invalid authorization request state."}

当我搜索短语“无效的授权请求状态”时,Google 没有发现任何有意义的内容。我按照文档做了所有事情。知道我做错了什么吗?

【问题讨论】:

    标签: node.js passport.js auth0


    【解决方案1】:

    我遇到了同样的问题,这些错误是由于 Kubernetes 上的会话丢失导致我每次调用不同的实例(有点像负载平衡),我们所做的就是从 3 个实例减少到 1 个,然后修复。您也可以在 Auth0Strategy 配置中设置 state: false 的值,以仔细检查这是否可以让您继续前进。

    【讨论】:

      【解决方案2】:

      原来我没有正确设置/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 需要使用正确的参数调用

      【讨论】:

        【解决方案3】:

        对于那些仍有问题的人,问题可能出在其他地方。当我遇到这个问题时,它原来是由没有持续存在的会话 cookie 引起的!原来我的反向代理(在 Apache 上运行)没有正确配置。我在这里描述了我的解决方案:https://stackoverflow.com/a/67891167/8221175

        至于为什么感兴趣的人可能会发生这种情况,我在此处发布了对 GitHub 问题之一的解释:https://github.com/auth0/passport-auth0/issues/89#issuecomment-856971807

        简而言之:登录调用响应中的state 查询参数保存在会话中。如果会话不存在,则护照无法获取 state 数据,它会认为有人在劫持您的会话。这会导致“无效的授权请求状态”。消息,以及 userpassport.authenticate 回调中是虚假的。如果您的代码随后重定向到“/login”,则整个过程会重复,从而导致无限循环。

        解决方法是确保您的 cookie 被正确保存,因此您的会话持续存在。您可以使用我在链接中提供的示例。

        【讨论】:

          猜你喜欢
          • 2011-10-08
          • 2017-01-24
          • 2019-03-20
          • 1970-01-01
          • 2012-07-07
          • 1970-01-01
          • 2014-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多