获取错误:您的客户端没有在firebase函数中获取URL的权限



我是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>

我试着重新部署这些功能,但没有成功。

解决方案:删除您的功能并重新部署它们

我所做的是:

  1. functions/index.ts导出了一个伪函数,并删除了我的原始函数
  2. 已部署。这删除了我原来的功能
  3. 验证了虚拟功能运行良好
  4. 恢复了我原来的功能并重新部署
  5. 验证了我原来的功能是否有效

背景和可能的原因

我有一个新的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.

在尝试删除单个函数并再次上传后,最终我不得不删除所有以前部署的函数并将其全部部署。

一旦我做了几次,功能就部署好了。

我能想到造成这种情况的两个可能原因,都很模糊。

  1. 我发现有一个有问题的文件,唯一修复部署的就是更改文件名的长度。是的,文件名的长度。一个字符太长,部署失败。如果这是一台windows95机器,我会说继承链路径对编译器来说太长了。然而,编译和在模拟器上运行都很好。谁知道呢。

  2. 我曾尝试设置云构建,但这部分工作只完成了一半。我已经更新了.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。

相关内容

  • 没有找到相关文章

最新更新