firebase - 如何修复可调用函数中的 Firebase CORS 错误?
问题描述
我对 Firebase 和 COR 有疑问,显然它无法到达端点并出现以下错误:
CORS 策略已阻止从源“https://trato.app”获取“https://europe-west2-XXX.cloudfunctions.net/fetchChatToken”的访问权限:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。服务.ts:203
POST https://europe-west2-XXX.cloudfunctions.net/fetchChatToken net::ERR_FAILED(匿名)@service.ts:203 ... ...
error.ts:66 Uncaught (in promise) Error: internal at new t (error.ts:66) at error.ts:175 at e. (service.ts:276) 在 tslib.es6.js:100 在 Object.next (tslib.es6.js:81) 在 (tslib.es6.js:71)
我还检查了开发检查器(chrome)上的网络选项卡以检查 CORS 标头是否存在,我没有看到它。
另外,我一直在检查 firebase 函数日志,显然甚至没有被调用,最后一行显示的是部署。
我使用它的方式是这样的:
前端侧:
const functions = firebaseApp.functions('europe-west2');
export const fetchChatToken = async () => (await functions.httpsCallable('fetchChatToken')()).data;
功能(后端)端:
const ensureAuthentication = auth => { if (!auth) throw new HttpsError("unauthenticated", "authentication required"); };
exports.fetchChatToken = functions.region("europe-west2").https.onCall((data, context) => {
ensureAuthentication(context.auth);
try {
const { AccessToken } = twilio.jwt;
const { ChatGrant } = AccessToken;
const grant = new ChatGrant({
serviceSid: conversationsid
});
const token = new AccessToken(accountsid, apikey, apisecret);
token.addGrant(grant);
token.identity = context.auth.uid;
return token.toJwt();
} catch (error) {
console.error(error);
throw new HttpsError("internal", "internal error");
} });
解决方案
不幸的是,这个 CORS 错误可能有很多原因。如果云函数返回“内部”错误消息,可能是由于区域不一致或云函数代码中的错误。我在创建新的云功能时出现此错误的清单:
- Firestore-Project、函数和客户端初始化的不匹配区域导致 CORS 错误
- 云函数内部的代码错误导致此错误
- 新功能必须包含在云功能索引文件中(如果使用)
- 云函数名称必须与客户端调用上的字符串匹配
- 错误后在部署新功能之前删除firebase仪表板中的云功能
推荐阅读
- python - 如何创建大量表
- python - 我在尝试计算退休年龄的脚本中有错误
- vhdl - 在 VHDL 中,如何检查 case 语句值部分满足某些信号值而其余无关紧要?
- c - fopen 在变量文件路径上失败
- javascript - 如何使用生成随机数的函数将随机项添加到数组中
- python - 如何获取一串数字并找出数字是否在增加?
- xml - XML 根据匹配将除 text() 之外的所有内容从一个 XML 复制到另一个 XML
- api - 空手道 API 构建来自 csv 文件的动态请求 XML,如果 resp 标记值在 csv 中为空,我不希望在请求中创建标记
- ssl - MyDomain.com 只为正 SSL 证书提供可复制文本:一份用于证书,一份用于密钥。如何在我的 nginx Web 服务器上安装它?
- mips - 为数组分配空间