Search code examples
javascriptfirebaseexpressfirebase-hosting

Express session does not work with Firebase Hosting


When I have the following, sessions are persisted and the page counts the number of visits.

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!");
   }
});

However, when I remove the app.listen(3000, ...) and instead run in localhost through the command firebase serve in the CLI, sessions are not persisted.

I also tried running on production environment through firebase deploy but, again, sessions are not persisted.

I have tried multiple options on the app.use(session({ and I believe the solution might be there.

Any recommendations?

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 }
}));

Solution

  • If you are using firebase hosting you might as well use a connector which connects your express session with firebase.

    You can try connect-session-firebase middleware which will integrate the firebase database store with the current express session. This might resolve your issue regarding session persistence.

    UPDATE:

    If you are using firebase hosting and cloud functions then you can only set a cookie with name __session. You might have to use this name to persist sessions in firebase hosting.

    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 }
    }));
    

    For more info: