使用 Auth0 注销时 Heroku "returnTo" 查询字符串参数错误

Heroku "returnTo" querystring parameter error on logout using Auth0

我正在使用 Heroku 并且大部分部署成功。注销让我真的很难过。 根据文档,我应该传递 url 之类的

https://xxxxauth0tennantxxxx/v2/logouthttps://YOUR_DOMAIN/v2/logout?returnTo=http%3A%2F%2Fwww.example.com

当我这样做时,我恢复正常。但我使用的是 Auth0 文档中的以下代码,它构建了 url 包括端口号。

router.get('/logout', (req, res) => {
  req.logOut();
  let returnTo = req.protocol + '://' + req.hostname;
  const port = req.connection.localPort;
  if (port !== undefined && port !== 80 && port !== 443) {
    returnTo += ':' + port;
  }
  const logoutURL = new url.URL(
    util.format('https://%s/v2/logout', process.env.AUTH0_DOMAIN),
  );
  const searchString = querystring.stringify({
    client_id: process.env.AUTH0_CLIENT_ID,
    returnTo: returnTo,
  });
  logoutURL.search = searchString;
  res.redirect(logoutURL);
});

Heroku 会自动分配一个端口,因此每次我尝试注销时都会遇到 The "returnTo" querystring parameter "http://xxxxx.herokuapp.com:12345" is not defined as a valid URL in "Allowed Logout URLs".

错误

我已经尝试添加允许注销的每个变体url我可以尝试但没有运气http://localhost:8000,http://*.herokuapp.com,https://*.auth0.com/v2/logout,https://*.auth0.com/,https://xxxxxxx.auth0.com我什至尝试设置app.set('trust proxy', 1);正如一些文档建议的Heroku。

拜托,我如何解释 heroku 在我注销时分配的动态端口 url?

编辑:我也尝试过端点的这种变体

并且我尝试将端点调用编辑为

    router.get('/logout', (req, res) => {
    let returnTo = req.protocol + '://' + req.hostname;
    const port = req.connection.localPort;
    if (port !== undefined && port !== 80 && port !== 443) {
    returnTo = process.env.NODE_ENV === 'production' ? `${returnTo}/` : `${returnTo}:${port}/`;
  }
    req.logout();
    if (req.session) {
      req.session.destroy(function(err) {
        if (err) {
          console.log(err);
      }
      console.log('Destroyed the user session on Auth0 endpoint');
      res.redirect(req.protocol + '://' + process.env.AUTH0_DOMAIN + '/v2/logout?client_id=' + process.env.AUTH0_CLIENT_ID + '&returnTo=' + returnTo +' ');
    });
    }
    });

如错误消息所示,您需要将 http://xxxxx.herokuapp.com:12345 添加到应用程序设置中的允许注销 URL。将 XXXXX 替换为 heroku 应用名称并包括端口号。

最后,我只是在构建 url 时删除了端口,瞧,注销并重定向到主页。

  router.get('/logout', (req, res) => {
  let returnTo = req.protocol + '://' + req.hostname;
  const port = req.connection.localPort;
  if (port !== undefined && port !== 80 && port !== 443) {
    returnTo = process.env.NODE_ENV === 'production' ? `${returnTo}/` : `${returnTo}`;
  }
  req.logout();

  if (req.session) {
    req.session.destroy(function(err) {
      if (err) {
        console.log(err);
      }
      console.log('Destroyed the user session on Auth0 endpoint');

      const logoutURL = new url.URL(
          util.format('https://%s/v2/logout', process.env.AUTH0_DOMAIN),
      );
      const searchString = querystring.stringify({
        client_id: process.env.AUTH0_CLIENT_ID,
        returnTo: returnTo,
      });
      logoutURL.search = searchString;

      res.redirect(logoutURL);

    });
  }
});

休息一下对疲倦的眼睛有什么不同,有这么多(优秀的)文档,只是非常令人困惑和不知所措,但我想我现在明白了。现在检查一切是否安全且可以安全使用。