从 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 阻止的主要内容,如果未能解决你的问题,请参考以下文章