web-dev-qa-db-fra.com

la fonction cloud de firebase ne stockera pas de cookie nommé autre que "__session"

j'ai suivi l'échantillon de authorisé-https-endpoint et seulement ajouté console.log pour imprimer les req.cookies, le problème est que les cookies sont toujours vides {} J'ai défini les cookies en utilisant les appels JS du client et ils enregistrent mais pour une raison quelconque, je ne peux pas les obtenir côté serveur.

voici le code complet de index.js, c'est exactement le même que l'exemple:

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const express = require('express');
const cookieParser = require('cookie-parser')();
const cors = require('cors')({Origin: true});
const app = express();

const validateFirebaseIdToken = (req, res, next) => {
  console.log(req.cookies); //// <----- issue this is empty {} why?? 
  next();
};

app.use(cors);
app.use(cookieParser);
app.use(validateFirebaseIdToken);
app.get('/hello', (req, res) => {
  res.send(`Hello!!`);
});

exports.app = functions.https.onRequest(app);

cookie de stockage:

curl http://FUNCTION_URL/hello --cookie "__session=bar" // req.cookies = {__session: bar}

ne stocke pas:

curl http://FUNCTION_URL/hello --cookie "foo=bar" // req.cookies = {}

17
Sagiv Ofek

Si vous utilisez Firebase Hosting + Cloud Functions, __session est le seul cookie que vous pouvez stocker, de par sa conception. Cela est nécessaire pour que nous puissions mettre en cache efficacement le contenu sur le CDN - nous supprimons tous les cookies de la demande autres que __session. Cela devrait être documenté mais ne semble pas l'être (oups!). Nous mettrons à jour la documentation pour refléter cette limitation.

En outre, vous devez définir l'en-tête Cache-Control comme privé

res.setHeader('Cache-Control', 'private');
34
Michael Bleigh

Wow cela m'a coûté 2 jours de débogage. Il est documenté (sous Hébergement> Servir le contenu dynamique et les microservices de l'hôte> Gérer le comportement du cache , mais pas dans un endroit que je trouvé utile - il est tout en bas "Utilisation de cookies"). L'exemple de code sur Gérer les cookies de session qu'ils fournissent utilise le nom du cookie session au lieu de __session qui, dans mon cas, est la cause de ce problème pour moi.

Je ne sais pas si cela est spécifique à Express.js servi via les fonctions cloud uniquement, mais c'était mon cas d'utilisation. La partie la plus frustrante était que lors des tests locaux à l'aide de firebase serve la mise en cache ne prend pas en compte, donc cela a très bien fonctionné.

3
ehed

La réponse et la convention de dénomination ci-dessus sont-elles toujours valides? Je n'arrive pas à transmettre de cookie, pour inclure un cookie de session nommé "__session", à une fonction cloud.

J'ai configuré une fonction de test simple, avec les règles de réécriture Firebase appropriées:

export const test = functions.https.onRequest((request, response) => {

    if (request.cookies) {
        response.status(200).send(`cookies: ${request.cookies}`);
    } else {
        response.status(200).send('no cookies');
    }
});

La fonction est appelée à chaque fois que j'accède https://www.xxxcustomdomainxxx.com/test , mais request.cookies est toujours indéfini et donc 'aucun cookie' n'est renvoyé.

Par exemple, ce qui suit renvoie toujours "pas de cookies":

curl https://www.xxxcustomdomainxxx.com/test --cookie "__session=testing"

J'obtiens le même comportement en utilisant le navigateur, même après avoir vérifié qu'un cookie de session nommé __session a été correctement défini via mon point de terminaison d'authentification. De plus, le lien cité ci-dessus ( https://firebase.google.com/docs/hosting/functions#using_cookies ) ne spécifie plus rien sur les cookies ou les conventions de dénomination.

0
Jack