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