В настоящее время я развертываю разобщенное веб-приложение, которое использует passport.js для аутентификации пользователей. Когда я запускаю свое приложение локально или когда я разворачиваю свое приложение в сочетании с heroku, у меня не возникает проблем с получением пользователя из сеанса паспорта. Тем не менее, у развязанной версии моего приложения нет сеанса паспорта в файлах cookie, поэтому я не могу заставить пользователя войти в систему.
Как примечание, для связанного развертывания я использую исключительно heroku, тогда какдля моего развязанного развертывания я использую netlify для моего внешнего интерфейса и heroku для моего внутреннего.
Я уже пытался добавить заголовок, чтобы разрешить учетные данные
res.append('Access-Control-Allow-Credentials', true);
Я полагаю, что это не такработать, потому что это проблема сессий, а не просто разрешения учетных данных.
Server.js
require("dotenv").config();
// Require Packages
const express = require("express");
const app = express();
const db = require("./models");
const routes = require("./routes");
const passport = require("passport");
const session = require("express-session")
const MySQLStore = require("express-mysql-session")(session);
require("./config/passport")(passport)
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
let options = {};
if (process.env.NODE_ENV === 'production') {
options = {
host: process.env.HOST,
port: 3306,
user: process.env.USER,
password: process.env.PASSWORD,
database: process.env.DB
}
} else {
options = {
host: 'localhost',
port: 3306,
user: 'root',
password: process.env.DB_PASSWORD,
database: 'tracker'
}
}
// Options for mysql session store
let sessionStore = new MySQLStore(options);
// Pass in mysql session store
app.use(session({
key: 'surfing_dogs',
secret: 'surfing_dogs',
store: sessionStore,
resave: false,
saveUninitialized: false
}))
app.use((req, res, next) => {
res.append('Access-Control-Allow-Origin', ['https://youthful-shockley-623377.netlify.com']);
res.append('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.append('Access-Control-Allow-Headers', 'Content-Type');
res.append('Access-Control-Allow-Credentials', true);
next();
});
app.use(passport.initialize());
app.use(passport.session());
app.use(routes)
db.sequelize.sync({ force: false }).then(() => {
let server = app.listen(process.env.PORT || 5000, function () {
let port = server.address().port;
console.log(`Server is listening on PORT ${port}`)
})
})
/ auth / index.js Я вызываю маршрут / user, чтобы получить пользователя, которыйв сеансе паспорта
router.get('/user', (req, res) => {
if (req.isAuthenticated()) {
var currentUser = req.session.passport.user;
} else {
//not logged in :(
}
Мои ожидаемые результаты будут такими, что при успешном входе в систему пользователь будет сохранен в сеансе паспорта, но его там не было.
Ответ от локальногои совместное развертывание req.session
Request Session
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
passport:
{ user:
{ id: 1,
firstName: 'Guy',
lastName: 'Fieri',
email: 'guy@gmail.com',
password: 'flavortown',
userType: 'administrator',
createdAt: null,
updatedAt: null } } }
Ответ от развязанного развертывания
Request Session
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true }
Еще один путь, где может быть ошибка с моей стороны, заключается в том, что я хранюssions с сеансом MySQL, который представляет собой пакет npm, с которым я не слишком знаком. Я использую его, потому что при развертывании упоминалось, что я должен использовать его