firebase云功能不会存储名为" __ session"以外的cookie。

时间:2017-07-05 14:53:20

标签: javascript firebase cookies google-cloud-functions firebase-hosting

我跟着authorized-https-endpoint的样本,只添加了console.log来打印req.cookies,问题是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 = {}

4 个答案:

答案 0 :(得分:22)

如果您使用的是Firebase托管+云端功能,__session是您可以按设计存储的唯一Cookie。这对于我们能够有效地在CDN上缓存内容是必要的 - 我们从res.setHeader('Cache-Control', 'private'); 以外的请求中删除所有cookie。这应该记录在案,但似乎不是(哎呀!)。我们将更新文档以反映此限制。

此外,您需要将Cache-Control Header设置为private

{{1}}

答案 1 :(得分:1)

哇,这花了我2天的调试时间。 已记录(在“托管”>“提供动态内容和主机微服务”>“ Manage cache behavior下”,但不在我认为有用的位置),它位于“使用Cookies”的最底端。 )。他们提供的Manage Session Cookies上的示例代码使用cookie名称session代替了__session,在我看来,这就是导致我遇到此问题的原因。

不确定这是否仅通过云功能提供给Express.js,但这是我的用例。最令人沮丧的是,在使用firebase serve缓存进行本地测试时,没有考虑到这一点,因此效果很好。

答案 2 :(得分:0)

以上答案和命名约定仍然有效吗?我似乎无法将任何名为cookie的会话cookie传递给云函数。

我使用正确的Firebase重写规则设置了一个简单的测试功能:

MongoDB.Driver.Linq.IMongoQueryable<T>

每次访问https://www.xxxcustomdomainxxx.com/test时都会调用该函数,但是request.cookies始终未定义,因此不会返回“没有cookie”。

例如,以下内容始终返回“无cookie”:

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

即使在通过我的身份验证端点正确设置了名为__session的会话cookie之后,我也使用浏览器获得了相同的行为。此外,上面引用的链接(https://firebase.google.com/docs/hosting/functions#using_cookies)不再指定有关cookie或命名约定的任何内容。

答案 3 :(得分:0)

不要尝试req.cookies,而是使用req.headers.cookie。您将不得不手动处理 cookie 字符串,但至少您不需要实现 express cookie 解析器,如果这对您来说是个问题。

相关问题