我需要在我的python解决方案中使用Cloud Vision API,我现在一直依赖API密钥,但目前我正在尝试给我的Compute Engine默认服务帐户调用所需的范围愿景,到目前为止运气不佳。
我已通过cloud console在我的项目中启用了vision API,但我仍然收到403错误:
请求的身份验证范围不足。
我会从我的gce的编辑详细信息选项卡中为每个API单独设置访问权限,但找不到其他API列出的Vision。 我设法从Vision API正确接收正确响应的唯一方法是通过标记“允许完全访问所有Cloud API”复选框,再次从我的gce的编辑详细信息选项卡,但这对我来说听起来不太安全。
希望有更好的方法可以做到这一点,但我找不到有关身份验证的Vision的文档,也没有关于堆栈溢出的任何问题(有些人有一个密切的话题,但是没有一个提议的答案非常适合我的情况,或提供工作解决方案)。
提前感谢您的帮助。
修改
我正在添加我可以在云控制台的gce默认服务帐户中单独启用的每个API的列表:
大量查询; Bigtable Admin; Bigtable数据;云数据存储;云调试器; Cloud Pub / Sub;云源存储库;云SQL;计算引擎;服务控制;服务管理; Stackdriver日志API; Stackdriver Monitoring API; Stackdriver Trace;存储;任务队列;用户信息
它们似乎都没有对我的需求有用,尽管启用它们的完全访问权限解决了我的问题对我来说非常困惑。
编辑#2
我会尝试更简明地陈述我的问题: 如何将https://www.googleapis.com/auth/cloud-vision添加到我的gce实例的默认帐户?
我正在寻找通过以下任何方式实现这一目标的方法:GCP控制台,gcloud命令行,甚至通过Python(目前我正在使用googleapiclient.discovery.build,我不知道是否有任何方法可以通过图书馆询问视觉api范围。
或者只要通过IAM限制角色,是否可以启用所有范围?如果是这样的话,我该怎么做?
我真的无法找到文档,再次感谢你。
答案 0 :(得分:0)
Google Cloud API(视觉,自然语言,翻译等)不需要任何特殊权限,您只需在项目中启用它们(转到控制台中的API Library标签)并创建API密钥或访问它们的服务帐户。
鉴于Service Accounts are the recommended approach for authentication with Google Cloud Platform services,您决定从API密钥迁移到服务帐户是正确的,出于安全考虑,Google建议您使用它们而不是API密钥。
话虽如此,我发现您使用的是旧Python API Client Libraries,它使用了您提到的 googleapiclient.discovery.build 服务。截至目前,较新的idiomatic Client Libraries是推荐的方法,它们取代了您正在使用的旧版API客户端库,因此我强烈建议您朝着这个方向前进。它们更易于使用,更易于理解,更易于记录,并且the recommended approach to access Cloud APIs programatically。
以此为出发点,我将这个答案分为两部分:
使用客户端库
如果您决定遵循我的建议并迁移到新的客户端库,那么鉴于客户端库使用应用程序默认凭据(ADC)进行身份验证,身份验证将非常简单。 ADC使用计算引擎的默认服务帐户来提供身份验证,因此您根本不必担心它,因为默认情况下它会工作。
一旦该部分清楚,您可以继续创建示例代码(例如documentation中提供的示例代码),并且一旦您测试一切正常工作,您就可以继续到完整的Vision API Client Library reference page以获取有关库如何工作的信息。
使用(旧版)API客户端库 如果,尽管我的话,你想坚持旧的API客户端库,你可能会对这个其他文档页面感兴趣,其中有一些关于Authentication using the API Client Libraries的完整信息。更具体地说,整整一章专门解释OAuth 2.0 authentication using Service Accounts。
使用如下所示的简单代码,您可以使用the google.oauth2.service_account
module从首选SA的JSON密钥文件加载凭据,指定所需的范围,并在构建Vision客户端时使用它指定credentials=credentials
:
from google.oauth2 import service_account
import googleapiclient.discovery
SCOPES = ['https://www.googleapis.com/auth/cloud-vision']
SERVICE_ACCOUNT_FILE = '/path/to/SA_key.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
vision = googleapiclient.discovery.build('vision', 'v1', credentials=credentials)
<强> 编辑: 强>
我忘了添加,为了让Compute Engine实例能够使用Google API,必须使用https://www.googleapis.com/auth/cloud-platform
范围授予它(事实上,这与选择允许完全访问所有Cloud API )。这在GCE Service Accounts best practices中有记录,但你是this would allow full access to all resources and services in the project。
或者,如果您担心允许“全部访问”范围的影响,请在this other documentation page中解释您可以允许完全访问,然后通过IAM角色执行限制访问。
在任何情况下,如果您要将仅 Vision范围授予实例,您可以通过运行以下gcloud
命令来执行此操作:
gcloud compute instances set-service-account INSTANCE_NAME --zone=INSTANCE_ZONE --scopes=https://www.googleapis.com/auth/cloud-vision
可以从this page获取Cloud Vision API范围(https://www.googleapis.com/auth/cloud-vision
),与任何其他Cloud API一样。
此外,如本节中关于SA permissions and access scopes所述,SA权限应符合实例范围;这意味着最严格的许可将适用,因此您也需要考虑到这一点。