web-dev-qa-db-ja.com

firebaseクラウド関数は「__session」以外の名前のCookieを保存しません

authorized-https-endpoint のサンプルに従い、req.cookiesを出力するためにconsole.logのみを追加しました。問題は、cookieが常に空であるということです{}クライアントのJS呼び出しを使用してCookieを設定しましたが、保存されますが、何らかの理由でサーバー側で取得できません。

index.jsの完全なコードは次のとおりです。サンプルとまったく同じです。

'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:

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

保存しません:

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

17
Sagiv Ofek

Firebase Hosting + Cloud Functionsを使用している場合、__sessionは設計上、保存できる唯一のCookieです。これは、CDNのコンテンツを効率的にキャッシュできるようにするために必要です。__session以外のすべてのCookieをリクエストから削除します。これは文書化されるべきですが、そうではありません(おっと!)。この制限を反映するようにドキュメントを更新します。

また、キャッシュ制御ヘッダーをプライベートとして設定する必要があります

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

なんと2日間のデバッグに費やされました。それはis文書化されています([ホスティング]> [動的コンテンツの提供]および[ホストマイクロサービス]> キャッシュ動作の管理 )。有用であることがわかりました-それは一番下の「Cookieの使用」にあります)。彼らが提供する Manage Session Cookies のサンプルコードは、__sessionではなくsessionを使用しています。これが私の場合、この問題の原因です。

これがクラウド機能のみを介して提供されるExpress.jsに固有のものかどうかはわかりませんが、それが私のユースケースでした。最も苛立たしいのは、firebase serveを使用してローカルでテストするときにキャッシュが考慮されないため、問題なく機能することです。

3
ehed

上記の答えと命名規則はまだ有効ですか? 「__session」という名前のセッションCookieを含めるために、Cookieをクラウド関数に渡すことができないようです。

適切なFirebase書き換えルールを使用して、簡単なテスト関数をセットアップします。

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

https://www.xxxcustomdomainxxx.com/test にアクセスするたびに関数が呼び出されますが、request.cookiesは常に未定義であるため、「Cookieなし」が返されます。

たとえば、次は常に「Cookieなし」を返します。

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

認証セッションを介して__sessionという名前のセッションCookieが正しく設定されていることを確認した後でも、ブラウザーを使用して同じ動作が得られます。さらに、上記のリンク( https://firebase.google.com/docs/hosting/functions#using_cookies )では、Cookieまたは命名規則について何も指定されていません。

0
Jack