从 Firebase 托管到 Firebase 功能的请求被 CORS 阻止

Posted

技术标签:

【中文标题】从 Firebase 托管到 Firebase 功能的请求被 CORS 阻止【英文标题】:Request from Firebase Hosting to Firebase Function blocked by CORS 【发布时间】:2019-05-30 09:15:48 【问题描述】:

我正在尝试在两个设备之间为一个小型原型发送推送通知。它们都是集成了 firebase SDK 的 Vue.js 应用程序,因此为了实现推送通知流程,我部署了一个 firebase 函数,但是当我从任何设备调用它时,都会收到一个 CORS 错误作为响应。

两个设备(移动设备和桌面设备)具有相同的客户端代码并且知道彼此的令牌(存储到 firebase 实时数据库中)。 该函数仅使用 firebase 消息发送推送通知。

Firebase 功能:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const cors = require('cors')( origin: true );

admin.initializeApp();

exports.notification = functions.https.onRequest((req, res) => 
    return cors(req, res, () => 
        if (req.method === "POST") 
            return admin.messaging().send(notification)
                .then(result => 
                    console.log(result);
                    res.status(200).send("ok")
                )
                .catch(err => res.status(500).send(err));
         else 
            return res.status(400).send("Method not allowed");
        
    );
);

客户端代码:

send(notification, token) 
    return fetch("https://[zone]-[project].cloudfunctions.net/notifications", 
        method: "POST",
        headers:  "Content-Type": "application/json" ,
        body: JSON.stringify( token, notification )
    );


错误是:

Access to fetch at 'https://[zone]-[project].cloudfunctions.net/notifications' from origin 'https://[project].web.app' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.

【问题讨论】:

你确定这个函数甚至被调用了吗?控制台日志说什么? 谢谢@DougStevenson,我发现了错误。它就像我尝试使用错误 URI 的函数一样简单。函数 URI 是 /notification,我将请求发送到 /notifications 【参考方案1】:

您能使用functions.https.onCall 触发器吗?

见https://firebase.google.com/docs/functions/callable。

Firebase 客户端 SDK 的 Cloud Functions 可让您直接从 Firebase 应用调用函数。要以这种方式从您的应用调用函数,请在 Cloud Functions 中编写和部署一个 HTTPS 可调用函数,然后添加客户端逻辑以从您的应用调用该函数。

【讨论】:

我尝试将函数更改为可调用,但得到了相同的结果。在那之后,我发现我太愚蠢了,我试图用错误的 URI 调用函数。非常感谢!【参考方案2】:

我用来调用函数的 URI 错误。解决了。抱歉这个问题。

【讨论】:

以上是关于从 Firebase 托管到 Firebase 功能的请求被 CORS 阻止的主要内容,如果未能解决你的问题,请参考以下文章

带有 Firebase 托管的 Flutter web 无法从存储中加载图片

如何从 Firebase 中删除托管网站

如何将nodeJS项目托管到firebase?

由于 CORS 问题,firebase 托管阻止脚本

Firebase 托管 + 使用 webpack 进行反应

将 .well-known/assetlinks.json 上传到 Mac 上的 Firebase 托管