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

时间:2019-05-30 09:15:49

标签: javascript firebase google-cloud-functions firebase-hosting web-notifications

我正在尝试在两个设备之间发送推送通知,以获取小型原型。它们都是集成了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.

2 个答案:

答案 0 :(得分:2)

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

请参见https://firebase.google.com/docs/functions/callable

  

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

答案 1 :(得分:0)

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