【问题标题】:Browsers block CORS cookie浏览器阻止 CORS cookie
【发布时间】:2021-10-25 13:04:42
【问题描述】:

我正在使用通过 Firebase Hosting 在自定义域 - api.example.com 上托管的 Firebase Functions。

当用户登录我的网站时,会向服务器发送请求

await fetch(`https://api.example.com/test`, {
        method: 'POST',
    credentials: 'include',
    })
        .then(async function (response) {
            if (response.status == 200) {
                let text = await response.text();
                console.log(text);
            }
            else {
                console.log("Failed");
                return null;
            }
        });

在 Cloud Functions 中,测试端点被触发,如下所示:

exports.test = functions
    .https.onRequest((request, response) => {
        const expiresIn = 60 * 60 * 24 * 5 * 1000;
        const origin = request.headers.origin;

        const options = { maxAge: expiresIn, httpOnly: true, secure: true, sameSite: 'None'};
        response.cookie('__session', "123456", options);
        response.set('Access-Control-Allow-Origin', origin);
        response.set('Access-Control-Allow-Credentials', true);
        response.set('Access-Control-Allow-Headers', 'credentials');
        response.end(JSON.stringify({ status: 'success' }));
})

问题是: mozilla、chrome、safari 的浏览器开发工具显示服务器的响应,其中标头包含 set-cookie: __session=123456; Max-Age=432000; Path=/; Expires=Mon, 30 Aug 2021 11:25:25 GMT; HttpOnly; Secure; SameSite=None 但 cookie 未存储在 Mozilla Firefox 和 Safari 中。在 Chrome 中,它会被存储,但在页面刷新后会被删除,尽管它应该会持续存在。

我在这里做错了什么?有什么建议吗?

【问题讨论】:

    标签: firebase google-chrome cookies google-cloud-functions cross-domain


    【解决方案1】:

    我找到了解决方案。 我没有为 cookie 选项指定域。

    它应该如下所示:

    exports.test = functions
        .https.onRequest((request, response) => {
            const expiresIn = 60 * 60 * 24 * 5 * 1000;
            const origin = request.headers.origin;
    
            const options = { maxAge: expiresIn, httpOnly: true, secure: true, sameSite: 'None', domain: 'example.com'};
            response.cookie('__session', "123456", options);
            response.set('Access-Control-Allow-Origin', origin);
            response.set('Access-Control-Allow-Credentials', true);
            response.set('Access-Control-Allow-Headers', 'credentials');
            response.end(JSON.stringify({ status: 'success' }));
    })
    

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 1970-01-01
      • 2021-09-19
      • 2022-01-21
      • 2014-11-14
      • 2012-04-16
      • 2020-04-30
      • 2011-01-20
      • 2013-05-01
      相关资源
      最近更新 更多