Angular Universal / Node: сервер не имеет доступа к сеансу. Создание нового при каждой перезагрузке - PullRequest
0 голосов
/ 26 апреля 2019

Я использую сеансовую аутентификацию в своем приложении Angular Universal.Проблема в том, что когда http-запрос сделан из приложения Angular, серверная часть (node.js) не обращается к текущему сеансу, а создает новый.Вы можете подумать, что это потому, что cors, но дело в том, что первая начальная загрузка не имеет доступа к сеансу.Поэтому, когда я открываю свое приложение на странице, на которой есть распознаватель или охранник, это делает http-запрос.Этот http-запрос создаст новую сессию.Затем переход на другие страницы в приложении, все работает.Запросы http, сделанные после начальной загрузки, получат доступ к сеансу.Если я начну со страницы, на которой нет средства распознавания / защиты, а затем перейду на страницу, на которой есть и выполняет http-запрос, этот запрос получит доступ к сеансу.

Вот как настраивается мой сеанс в index.js:

var sessionStore = new MySQLStore(options);
app.use(
    session({
        key: 'sessionStorage',
        store: sessionStore,
        secret: config.get('demoSess'), 
        saveUninitialized: false, 
        resave: false,
        name: 'demo',
        cookie: { 
            maxAge: 60000,
            secure: false
        },
    })
)

const cors = require('cors');
app.use(cors({
    origin: [
        'http://localhost:4200'
    ], 
    credentials: true
    })
);

А вот так http-запрос делается из внешнего интерфейса:

this.http.get(environment.apiUrl+'/server/page/auth', {withCredentials: true});

Это так и должно быть?Backend работает через порт 8080 и frontend 4200.

В app.module.ts я написал TransferHttpCacheModule.Если я удаляю его, я вижу из бэкэнда, когда я что-то консолью записываю в журнал, что первый http-запрос выполняется дважды: первый не получает доступ к сеансу, а затем второй.Поэтому, если бы я набрал console.log(req.session.userId) в /server/page/auth, я бы получил undefined и 1 на следующей строке.Когда я читал, что-то вроде этого было нормально, и чтобы обойти это, transferstate вступает в игру, но, как я понимаю, TransferHttpCacheModule - это в основном простой способ сделать transferstate.Я также пытался записать transferstate в распознаватель, и результаты были одинаковыми - только один запрос сделан, но этот запрос не будет иметь доступа к сеансу.

Я надеюсь, что что-то не хватает, когда я делаю http-запрос из внешнего интерфейсаили моя сессия / cors чего-то не хватает.На данный момент у меня заканчивается идея, что проверять или проверять, любой намек на то, что проверить, приветствуется.

1 Ответ

0 голосов
/ 27 апреля 2019

Итак, я начал строить свою аутентификацию в Angular для использования localStorage.Я столкнулся с проблемой и во время поиска решения наткнулся на учебник, рассказывающий о isPlatformBrowser.Итак, я начал думать, может быть, Angular Universal каким-то образом делает два запроса, но эти два запроса разные, и мне нужно устранить один из них.В итоге я завернул свой http-запрос if(isPlatformBrowser(this.platformId)) { }, и, похоже, я решил свою проблему.

...