我正在关注 Google 的教程为我的云功能设置端点。
当我尝试使用 URL 从浏览器访问端点时,service_name.a.run.app/function1
我得到了
Error: Forbidden
Your client does not have permission to get URL /function1GET from this server
作为上述教程的一部分,回答从 Google 产品经理那里,我通过授予 ESP 调用我的函数的权限来保护我的函数。
gcloud beta functions add-iam-policy-binding function1 --member "serviceAccount:[email protected]" --role "roles/cloudfunctions.invoker" --project "project_id"
我的openapi-functions.yaml
swagger: '2.0'
info:
title: Cloud Endpoints + GCF
description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
version: 1.0.0
host: HOST
x-google-endpoints:
- name: "HOST"
allowCors: "true
schemes:
- https
produces:
- application/json
paths:
/function1:
get:
operationId: function1
x-google-backend:
address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/function1GET
responses:
'200':
description: A successful response
schema:
type: string
请注意我添加了
- name: "HOST"
allowCors: "true'
到我的.yaml
文件,因为我需要从 Firebase 上托管的静态站点访问端点。
答案1
我最近遇到了这个问题。原来,自 2020 年 1 月 15 日起,新功能默认需要身份验证。
看文档在这里了解详情。
解决方案是在 Google Cloud Console 的 Cloud Functions 页面中手动Cloud Functions Invoker
向用户添加权限。allUsers
答案2
Google Cloud Functions 最近(不确定是多久前)添加了一些新的 IAM 功能,现在新功能默认不具有公共访问权限。
为了允许调用您的函数,您首先必须为该函数添加权限,您可以查看以下步骤:
https://lukestoolkit.blogspot.com/2020/06/google-cloud-functions-error-forbidden.html
答案3
您收到此错误消息“您的客户端无权从该服务器获取 URL /...”的原因有多种,其中包括:
您的互联网浏览器历史记录 - 尝试删除您的历史记录/缓存
帐户权限不足 - 尝试使用具有更高权限的其他帐户
缺少 SSL 参数 - 尝试使用“curl”命令直接访问 URL
检查恶意软件
答案4
虽然以上两个答案都是正确的,但通常要注意的是,您的功能部署会显示错误(与应用于部署的 IAM 策略有关),但无论如何都会部署该功能。
就我而言,我遵循的是Google Cloud 代码实验室示例当我遇到错误时。
我正在使用一个服务帐户,该帐户具有项目编辑器访问权限,因此我认为我可以应用该--allow-unauthenticated
策略,但事实证明项目编辑器仅提供该策略iam.roles.list
,iam.roles.get
因此该策略从未应用于该功能(因此出现上述错误)。
为了修复我必须:
- 删除该函数(仅在您应用该
--allow-unauthenticated
策略时才需要,因为它仅适用于该函数的第一次部署,并且在对函数的任何后续更新中都会被忽略) - 赋予服务账户额外的 IAM 相关角色。
- 再次部署该函数
我能够成功卷曲端点。