ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 计算引擎的服务帐户没有足够的范围用于云视觉api

2019-09-10 11:58:04  阅读:354  来源: 互联网

标签:python google-compute-engine google-cloud-platform google-cloud-vision


我需要在我的python解决方案中使用Cloud Vision API,我一直在依赖API密钥,但目前我正在尝试为我的Compute Engine的默认服务帐户调用Vision所需的范围,到目前为止运气不大.

我已经通过cloud console在我的项目中启用了vision API,但我仍然得到403错误:

Request had insufficient authentication scopes.

我会从我的gce的编辑详细信息选项卡中为每个API单独设置访问权限,但找不到其他API列出的Vision.
我设法从Vision API正确接收正确响应的唯一方法是通过标记“允许完全访问所有Cloud API”复选框,再次从我的gce的编辑详细信息选项卡,但这对我来说听起来不太安全.

希望有更好的方法来做到这一点,但我找不到有关身份验证的Vision的文档,也没有关于堆栈溢出的任何问题(有些有一个密切的主题,但没有提出的答案非常适合我的情况,或提供一个有效的解决方案)

预先感谢您的帮助.

gce's edit detail tab from goole cloud console

编辑

我正在添加我可以在云控制台的gce默认服务帐户中单独启用的每个API的列表:

BigQuery; Bigtable Admin; Bigtable Data; Cloud Datastore; Cloud Debugger; Cloud Pub/Sub; Cloud Source Repositories; Cloud SQL; Compute Engine; Service Control; Service Management; Stackdriver Logging API; Stackdriver Monitoring API; Stackdriver Trace; Storage; Task queue; User info

它们似乎都没有对我的需求有用,尽管实现对它们的完全访问都能解决我的问题对我来说非常困惑.

编辑#2

我会尝试更简洁地陈述我的问题:
如何将https://www.googleapis.com/auth/cloud-vision添加到我的gce实例的默认帐户?

我正在寻找一种方法,通过以下任何一种方式:GCP控制台,gcloud命令行,甚至通过Python(目前我正在使用googleapiclient.discovery.build,我不知道是否有任何通过图书馆询问视觉api范围的方法).

或者只要通过IAM限制角色,是否可以启用所有范围?如果是这样的话,我该怎么做?

我真的找不到文档的方法,再次感谢你.

解决方法:

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权限应符合实例范围;这意味着最严格的许可将适用,因此您也需要考虑到这一点.

标签:python,google-compute-engine,google-cloud-platform,google-cloud-vision
来源: https://codeday.me/bug/20190910/1798442.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有