Экспресс-сессия не работает с Firebase Hosting - PullRequest
0 голосов
/ 01 июля 2018

Если у меня есть следующее, сеансы сохраняются, и страница подсчитывает количество посещений.

app.set('trust proxy', true)
// The documentation specifies '1' instead of 'true'

app.use(session({
   secret: 'my secret',
   proxy: true,
   resave: false,
   saveUninitialized: true,
   cookie: { secure: false }
}))

app.listen(3000, function(){
   console.log("Server is connected!");
});

app.get("/login", (req, res) => {
   if(req.session.page_views){
       req.session.page_views++;
       res.send("You visited this page " + req.session.page_views + " times");
   } else {
       req.session.page_views = 1;
       res.send("Welcome to this page for the first time!");
   }
});

Однако, когда я удаляю app.listen(3000, ...) и вместо этого запускаю в localhost с помощью команды firebase serve в CLI, сеансы не сохраняются.

Я также пытался запустить в производственной среде через firebase deploy, но, опять же, сеансы не сохраняются.

Я попробовал несколько вариантов на app.use(session({, и я считаю, что решение может быть там.

Есть рекомендации?

UPDATE

const express = require('express');
const session = require('express-session');
const FirestoreStore = require('firestore-store')(session);
const bodyParser = require('body-parser');

app.use(cookieParser('My secret'));
app.use(bodyParser.urlencoded({ extended: true }));

app.use(session({
    store: new FirestoreStore({
         database: firebase.firestore()
    }),
    secret: 'My secret',
    resave: true,
    saveUninitialized: true,
    cookie: {maxAge : 60000,
             secure: false,
             httpOnly: false }
}));

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Я предложу что-то, вместо того чтобы использовать FirestoreStore , я предложу вам использовать FirebaseStore .

И я заметил, что вы используете Express, так что вы можете проверить использование ниже:

Express

ПРИМЕЧАНИЕ : в Express 4 экспресс-сессия должна быть передана в функцию connect-session-firebase export для расширения express-session.Store:

const express = require('express');
const session = require('express-session');
const FirebaseStore = require('connect-session-firebase')(session);
const firebase = require('firebase-admin');
const ref = firebase.initializeApp({
  credential: firebase.credential.cert('path/to/serviceAccountCredentials.json'),
  databaseURL: 'https://databaseName.firebaseio.com'
});

express()
  .use(session({
    store: new FirebaseStore({
      database: ref.database()
    }),
    secret: 'keyboard cat'
    resave: true,
    saveUninitialized: true
  }));

И вы, возможно, также захотите рассмотреть Безопасность , обеспечиваемую этой зависимостью

Если вы используете общедоступную базу данных Firebase, пожалуйста, установите правильную правила:

{
  "rules": {
    ".read": "false",
    ".write": "false",
    "sessions": {
      ".read": "false",
      ".write": "false"
    },
    "some_public_data": {
      ".read": "true",
      ".write": "auth !== null"
    }
  }
}

Вы можете прочитать подробнее о правилах Firebase и connect-session-firebase

0 голосов
/ 03 июля 2018

Если вы используете хостинг Firebase, вы также можете использовать соединитель, который соединяет ваш экспресс-сеанс с Firebase.

Вы можете попробовать промежуточное программное обеспечение connect-session-firebase , которое будет интегрировать хранилище базы данных firebase с текущим экспресс-сеансом. Это может решить вашу проблему с сохранением сеанса.

UPDATE:

Если вы используете Firebase хостинг и облачные функции, вы можете установить только cookie с именем __session. Возможно, вам придется использовать это имя для сохранения сеансов на хостинге Firebase.

app.use(session({
    store: new FirestoreStore({
         database: firebase.firestore()
    }),
    name: '__session',
    secret: 'My secret',
    resave: true,
    saveUninitialized: true,
    cookie: {maxAge : 60000,
             secure: false,
             httpOnly: false }
}));

Для получения дополнительной информации:

...