我是firebase的新手,我部署了一个函数,它使用的是get方法,
https://us-central******.cloudfunctions.net/addMessage
当我尝试运行这个api时,我得到了低于错误
Error: Forbidden
Your client does not have permission to get URL /addMessage from this server.
有人能帮我解决这个问题吗?
exports.addMessage = functions.https.onRequest(async (req, res) => {
// Grab the text parameter.
const original = req.query.text;
// Push the new message into the Realtime Database using the Firebase Admin SDK.
const snapshot = await admin.database().ref('/messages').push({ original: original });
// Redirect with 303 SEE OTHER to the URL of the pushed object in the Firebase console.
res.redirect(303, snapshot.ref.toString());
});
从文档,参数--allow-unauthenticated
:
指定函数调用时不需要身份验证。默认情况下,HTTP函数需要身份验证。如果您在第一次部署HTTP函数时没有包含此标志,系统会提示您允许未经身份验证的调用。后续调用时不会提示您。
因此,如果不需要身份验证,则需要使用此参数部署云函数。例如
一个简单的云函数index.js
:
exports.helloHttp = (req, res) => {
res.send(`Hello ${req.body.name || 'World'}!`);
};
无--allow-unauthenticated
:部署
gcloud beta functions deploy helloHttp --trigger-http --runtime nodejs10
当您访问此云函数的端点时:https://us-central1-xxxx-218801.cloudfunctions.net/helloHttp
。你会得到这个403 Forbidden
错误:
错误:禁止您的客户端没有从该服务器获取URL/helloHttp的权限。
使用--allow-unauthenticated
:部署
gcloud beta functions deploy helloHttp --trigger-http --runtime nodejs10 --allow-unauthenticated
您将在不进行身份验证的情况下访问端点。
Hello World!
我今天遇到了这个问题(或者一个非常类似的问题(。当我从Postman调用我的一个函数时,我得到了:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>401 Unauthorized</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Unauthorized</h1>
<h2>Your client does not have permission to the requested URL
<code>/myApi/somePath?</code>.</h2>
<h2></h2>
</body>
</html>
我试着重新部署这些功能,但没有成功。
解决方案:删除您的功能并重新部署它们
我所做的是:
- 从
functions/index.ts
导出了一个伪函数,并删除了我的原始函数 - 已部署。这删除了我原来的功能
- 验证了虚拟功能运行良好
- 恢复了我原来的功能并重新部署
- 验证了我原来的功能是否有效
背景和可能的原因
我有一个新的Firebase
项目,我多次尝试部署我的功能,但遇到了一些与权限有关的错误。我想这让函数处于一种奇怪的状态。。。
后来我成功地部署了这些函数,但它们的状态并不好,当我调用其中一个函数时,我从Postman
得到了错误响应。
我得到的错误如下:
错误1:
Error: Missing permissions required for functions deploy. You must have permission iam.serviceAccounts.ActAs on service account some-sa@appspot.gserviceaccount.com.
错误2:
Error: Missing permissions required for functions deploy. You must have permission iam.serviceAccounts.ActAs on service account some-sa@appspot.gserviceaccount.com.
错误3:
Unable to set the invoker for the IAM policy on the following functions:
someFunction1(us-central1)
someFunction2(us-central1)
Some common causes of this:
- You may not have the roles/functions.admin IAM role. Note that roles/functions.developer does not allow you to change IAM policies.
在尝试删除单个函数并再次上传后,最终我不得不删除所有以前部署的函数并将其全部部署。
一旦我做了几次,功能就部署好了。
我能想到造成这种情况的两个可能原因,都很模糊。
-
我发现有一个有问题的文件,唯一修复部署的就是更改文件名的长度。是的,文件名的长度。一个字符太长,部署失败。如果这是一台windows95机器,我会说继承链路径对编译器来说太长了。然而,编译和在模拟器上运行都很好。谁知道呢。
-
我曾尝试设置云构建,但这部分工作只完成了一半。我已经更新了.firebaserc作为其中的一部分。也许,只是也许,部署不喜欢默认项目列表发生了更改,并且与现有功能不匹配。
我完全在猜测原因,但由于错误非常模糊,没有明显的原因,我认为这可能有助于人们找到原因。
如果使用错误的子路径,也可能发生这种情况。对我来说,url不知怎么错了,它没有重新发送ConfirmEmail,而是试图调用重新发送ConformEmail%20。该功能不存在,谷歌以403:回应
https://europe-west1-my-project.cloudfunctions.net/resendConfirmEmail%20?userId=imFeBoV...&email=gr...%40...com
应该是什么时候:
https://europe-west1-my-project.cloudfunctions.net/resendConfirmEmail?userId=imFeBoV...&email=gr...%40...com
我在添加到一个项目中的一个新函数中遇到了类似的问题,该项目已经包含了几个没有任何问题的函数。在调用新函数时,我收到了一个带有HTML正文的401 Unauthorized
:
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>401 Unauthorized</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Unauthorized</h1>
<h2>Your client does not have permission to the requested URL <code>/myNewFunction</code>.</h2>
<h2></h2>
</body></html>
在谷歌云控制台的"功能"详细信息页面中,在"权限"选项卡下,我注意到它缺少";云函数调用程序";角色;所有用户";包含在所有其他函数中的原则。手动添加它并没有产生效果。然后我回忆说,我中止了该函数的第一次部署尝试,后来才完全部署,这可能使该函数处于某种意外状态。
我删除了该功能并重新部署了它。它现在包括";云函数调用程序";许可,它不再返回401。