Пользователь не хранится в сеансе со стратегией локального паспорта для развязанного приложения - PullRequest
0 голосов
/ 18 октября 2019

В настоящее время я развертываю разобщенное веб-приложение, которое использует 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, с которым я не слишком знаком. Я использую его, потому что при развертывании упоминалось, что я должен использовать его

...