У нас есть сервер 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 устанавливаются правильно, я почти уверен. Когда я запускаю это локально у меня нет никаких проблем.
Что может привести к тому, что сеанс не будет восстановлен, а вместо этого воссоздан с каждым запросом?