NodeJS Express Сессия не восстанавливается между маршрутами в kubernetes - PullRequest
0 голосов
/ 06 февраля 2020

У нас есть сервер NodeJS express с включенными express-session и express-mysql-session. Мы подключили базу данных сеансов и можем убедиться, что сеансы создаются. Наше приложение перенаправляет пользователей без маркера ie на Auth0 для аутентификации, и они перенаправляются обратно в наше приложение на /callback. Он успешно установил наш ID-токен, который позволяет нашему пользователю войти в систему. Однако стратегия passport auth0 жалуется, что не может проверить состояние аутентификации.

'Unable to verify authorization request state.'

Код сервера приведен ниже, с некоторыми другими частями закомментировано. Подключение к базе данных сеансов прошло успешно, поскольку мы видим, что наши сеансы создаются с каждым запросом.

const options = {
  database: process.env.SESSION_DB_NAME || "sessions",
  host: process.env.SESSION_DB_HOST! as string,
  password: process.env.SESSION_DB_PASSWORD! as string,
  port: parseInt(process.env.SESSION_DB_PASSWORD || "3306", 10),
  user: process.env.SESSION_DB_USER! as string,
};
const sessionStore = new MySQLStore(options);

app.use(
  session({
    cookie: {
      httpOnly: true,
      maxAge: 24 * 3600 * 1000, // 1 day
      secure: true,
    },
    resave: false,
    saveUninitialized: true,
    secret: process.env.SESSION_SECRET!,
    store: sessionStore,
  })
);

app.get("/login", (request, response, next) => {
  // if there is no session, it's a server error
  if (!request.session) {
    console.error(new Error("No session in /login"));
    return response.status(500).send("Server error: No Session");
  }

  return passport.authenticate("auth0", {
    scope: "openid email profile",
  })(request, response, next);
});

console.log("router: Auth0 Callback");
app.get("/callback", (request, response, next) => {
  const domain = request.hostname;
  console.log(request.session);

  passport.authenticate("auth0", (auth0Error, token, info) => {
    // if there was a problem authenticating
    if (auth0Error) {
      console.error(auth0Error);
      return response.status(500).send();
    }

    // ensure we have a session. The middleware should be giving us one.
    if (!request.session) {
      console.error("No session in /callback.");
      return response.status(500).send();
    }

    // if we couldn't log in
    if (!token) {
      if (info) {
        console.log(info);
        return response.status(500).send(info.message);
      }

      // redirect to the login page
      return response.status(401).send("Cannot log you in.");
    }

    // parse the token we get
    const user = jwt.decode(token);

    // if there is no valid user token, we've got bigger problems
    if (!user) {
      console.error("Token is falsey after authenticating.");
      return response.status(500).send();
    } else if (typeof user === "string") {
      console.error("Cannot decode JWT after authenticating");
      return response.status(500).send();
    }

    request.logIn(user, (logInError) => {
      // redirect to desired route
      // ...
    });
  })(request, response, next);
});

router.get("/*", (request, response, next) => {
  passport.authenticate("jwt", (authenticationError, isAuthenticated, info) => {
    // Log in successful via existing JWT
    if (isAuthenticated) {
      return next();
    }

    // handle unauthenticated situations
    // ...
  })(request, response, next);
});

Я попробовал следующие предложения в https://github.com/auth0/passport-auth0/issues/70:

  • app.set ("доверенный прокси", 1 ")
  • сессия готовит ie уже настроена на безопасную
  • , обслуживающую только по https
  • с использованием mysql хранилище сессий и хранилище по умолчанию в памяти

Мы запускаем сервер в кластере kubernetes, используя ClusterIP для нашего входа. Переменные env устанавливаются правильно, я почти уверен. Когда я запускаю это локально у меня нет никаких проблем.

Что может привести к тому, что сеанс не будет восстановлен, а вместо этого воссоздан с каждым запросом?

...