Firebase 云功能“您的客户端无权从此服务器获取 URL /200”

Posted

技术标签:

【中文标题】Firebase 云功能“您的客户端无权从此服务器获取 URL /200”【英文标题】:Firebase cloud function "Your client does not have permission to get URL /200 from this server" 【发布时间】:2018-05-10 17:39:21 【问题描述】:

我刚刚做了一个firebase云功能:

exports.deleteAfterSevenDays = functions.https.onRequest((req, res) => ...

我部署了函数并获得了函数 URL。当我从浏览器请求此 url 时,我收到以下消息:

"Error: Forbidden 您的客户端无权获取 URL /200 从这个服务器。”

我刚刚更新到 firebase Blaze 计划,因为我认为 Spark 计划存在限制,但它仍然无法正常工作。

在我的 firebase 云函数日志中写着“函数执行耗时 572 毫秒,以状态码完成:302”。

我的 cron 作业“由于执行失败太多而被自动禁用”。

你知道有什么问题吗?

【问题讨论】:

嗨@Alex9494 你解决这个问题了吗?干杯。 嗨,Ivan 还没有,但我确实打算“很快”解决它......第一个得到答案的人把它给了另一个人! ;) 看来我找到了问题的原因。这只是我正在调用的函数的崩溃。修复后,请求开始返回 200。 这也是我的 firebase 云函数代码中的一个问题。使用 res.redirect()、res.send() 或 res.end() 终止 HTTP 函数firebase.google.com/docs/functions/terminate-functions 【参考方案1】:

云函数应该有一个名为“所有用户”的成员的角色,可以从任何地方/任何人调用此函数,而无需考虑授权。

未经授权:

    转到云功能选项卡 选择您的云功能(复选框) 点击右侧“权限”选项卡下的“添加成员” 在“新成员”下输入“allUsers” 选择角色为“Cloud Functions -> Cloud Functions Invoker” 保存 只需将云功能粘贴到浏览器中即可测试它

授权:

在您的云功能上设置授权总是一个好习惯

注意:云函数抛出错误“403 Forbidden - Your client does not have permission to get URL”应由授权用户调用。

简单测试:

    点击顶部的Cloud shell(icon)终端

    type - gcloud auth print-identity-token

    复制生成的令牌

    在调用云函数时形成要传递的授权密钥 4.1 授权:bearer generated_token

    在调用云函数时使用上述授权密钥

注意:

    切勿向所有用户提供云功能

【讨论】:

我尝试了授权,但令牌似乎即将到期。我无法使用昨天相同的令牌 :( 这个令牌是 idToken - 它只有 3600 秒有效,之后你应该更新它。文档firebase.google.com/docs/auth/admin/manage-sessions 请注意,这是函数的 Google Cloud 接口,而不是 Firebase 接口 -- 转至:console.cloud.google.com/functions 如果我们使用上述建议的方法生成令牌,它将只有 1 小时有效。然后,我们不能再次使用相同的令牌。有没有办法生成永久令牌,只要提供正确的令牌,云功能就可以工作? 如果您建议“永远不要让所有用户都可以使用云功能”,那么身份验证的最佳做法是什么?您是否建议为对函数的每个请求生成一个令牌?在函数中使用 Firebase Auth 并简单地将 API 的访问权限设置为“allUsers”还不够吗?【参考方案2】:

来自 Cloud Function 文档:

注意:新的 HTTP 和 HTTP 可调用函数部署在任何 低于 7.7.0 版本的 Firebase CLI 默认为私有并抛出 调用时出现 HTTP 403 错误。要么明确地制作这些功能 公开,或在部署任何新的之前更新您的 Firebase CLI 功能。

就我而言,CLI 版本已过时。如果您当前收到 403 错误,请尝试以下操作:

    删除您的云函数 更新 Firebase CLI npm install -g firebase-tools 重新部署您的函数

【讨论】:

这解决了我的问题。我安装了最新的 firebase-tools,在 FIrebase 控制台上删除了我的功能并重新部署了它。等等瞧。谢谢! 除了更新 cli,我还必须启用未经身份验证的函数调用,如此处cloud.google.com/functions/docs/securing/…【参考方案3】:

要明确:

    转到您的函数(确保选择了您的项目):

https://console.cloud.google.com/functions/details/us-central1/s-s-r

    点击权限标签 点击添加权限 新校长: allUsers角色: Cloud Functions Invoker

完成。

J

【讨论】:

效果很好,谢谢【参考方案4】:

如果您在 2020 年遇到这种情况,也可能是由于访问行为不同:

注意:自 2020 年 1 月 15 日起,HTTP 函数需要通过以下方式进行身份验证 默认。您可以指定一个函数是否允许未经身份验证的 在部署时或部署后调用。

https://cloud.google.com/functions/docs/securing/managing-access-iam#allowing_unauthenticated_function_invocation

【讨论】:

【参考方案5】:

将目标云功能的 IAM 角色(Cloud Functions Invoker)更改为 allUsers 应该可以解决此问题。 https://console.cloud.google.com/functions

【讨论】:

我遇到了同样的问题 - 您能否澄清一下“针对所有用户的目标云功能”是什么意思? 这看起来存在安全风险?能否请您验证一下更改为 allUsers 是否没有任何安全风险? @Nikhil 不是,您总是在处理公共 https 函数,并且可能在其中处理自定义身份验证。【参考方案6】:

这可能有点牵强,但如果您中断了云功能部署,然后重新部署了该功能(这会导致错误),然后您成功地重新部署了该功能,这可能会导致问题。

我正在尝试重现,但简单地删除 firebase 控制台中的功能并重新部署对我有用。

【讨论】:

这并不牵强,它发生在我身上。步骤: 1. 部署了一个语法错误的函数,得到 Cloud Errors 有问题 错误(错误,叹气) 2. 使用更正的代码重新部署,认为一切正常 3. 看到条纹 webhook(命中函数)失败了Your client does not have permission to get URL 4. 再次尝试部署功能 - 没有修复错误 4. 找到这个帖子,删除所有功能,再次重新部署 - 修复【参考方案7】:

我知道这没有意义,或者不是真正的解决方案,但我通过将我的帐户设为 Firebase 项目的 Owner 来解决它。我在Editor 时工作得很好,但突然停止工作并将我的帐户设置为Owner 暂时解决了它。

我想这与某些帐户可以正确访问 Service Account 有关,这是与 Firebase Functions 和 Google Cloud API 的实际接口。

【讨论】:

我也面临同样的问题。我今天向 firebase 项目部署了一个新的云功能,但我无法执行它。给出完全相同的错误。 firebase 项目中的现有功能运行良好。所以看起来问题出在最近新部署的功能上。 这里有同样的问题。大家能找到解决办法吗?【参考方案8】:

就我而言,我在 Postman 中犯了错误 当我输入请求正文时,我没有将格式从文本切换到 JSON。

检查那部分。

【讨论】:

【参考方案9】:

启用从 Postman 项目的访问:

    打开https://console.cloud.google.com/functions 打开云外壳(右上方终端图标) 写信:gcloud auth print-identity-token 复制您的令牌并打开您的 Posman 右键单击您的收藏 -> 编辑 授权->选择类型OAuth 2.0 将您的令牌粘贴到访问令牌中

注意:您可以对单个请求或文件夹执行相同操作。

【讨论】:

以上是关于Firebase 云功能“您的客户端无权从此服务器获取 URL /200”的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云功能中的 Firebase 存储错误

Firebase 云功能总是超时

Firebase 云功能:ECONNREFUSED

firebase 云功能中带有 typescript 的 firebase-admin

在云功能 Firebase 中访问数据

firebase 云计划功能无法正常工作