BadRequestError:checks.state 参数丢失

sch*_*ing 6 redis node.js express auth0

我发现,每隔一段时间(不确定此错误的确切节奏),在用户成功通过身份验证后,我会收到以下错误(即发生这种情况的网址是https://website.com/callback):

BadRequestError: checks.state argument is missing:
at /var/www/app/html/node_modules/express-openid-connect/middleware/auth.js:94:29 
at processTicksAndRejections (internal/process/task_queues.js:97:5)
Run Code Online (Sandbox Code Playgroud)

我正在使用express-openid-connectv1.0.1 和新的通用登录页面。有趣的是,我在本地测试时从未遇到过这种情况,只有在上下文有帮助的情况下才在服务器上遇到这种情况。

更新1:拼图的另一块。当我收到上述错误,然后返回https://example.com/并再次单击“登录”时,身份验证和重定向工作完美,甚至没有看到通用登录屏幕。

从这一点开始,我可以注销并登录到我的心目中,而不会再次看到错误。

更新 2:我认为这可能与 cookies 以及 Express 服务器在 Nginx 后面运行这一事实有关,所以我添加了:

app.use("trust proxy", true);
Run Code Online (Sandbox Code Playgroud)

还是同样的问题:皱眉:

更新 3:我现在可以看到,第一次进行身份验证并收到所描述的错误时,域上没有设置 cookie。一旦我返回登陆页面并再次尝试身份验证,appSessioncookie 就会被设置并保留,因此,从那里开始(如前所述)登录和注销按预期工作。

更新4:我现在已经改用express-sessionredis。这是我使用的配置express-openid-connect

const config = {
  required: false,
  auth0Logout: true,
  appSession: false,
  handleCallback: async function (req, res, next) {
    // This will store the user identity claims in the session.
    req.session.userIdentity = req.openidTokens.claims();
    next();
  },
  getUser: async function (req) {
    return req.session.userIdentity;
  },
  baseURL:
    process.env.NODE_ENV === "production"
      ? "https://www.example.com"
      : "http://localhost:3000",
  clientID: "someid",
  issuerBaseURL: "https://site.eu.auth0.com",
};
Run Code Online (Sandbox Code Playgroud)

然后我有以下会话和 redis:

let RedisStore = require("connect-redis")(session);
let redisClient = redis.createClient();

app.use(
  session({
    store: new RedisStore({ client: redisClient }),
    secret: process.env.SESSION_SECRET,
    saveUninitialized: false,
    resave: false,
  })
);
Run Code Online (Sandbox Code Playgroud)

知道为什么第一次设置 cookie 会失败吗?但第二次尝试就成功了吗?这是连接节点模块中可能存在的错误吗?

还有其他人遇到过这个问题吗?关于决议有什么想法吗?谢谢