计算引擎的服务帐户对于云视觉api的作用域不足

2024-04-27 15:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在python解决方案中使用cloudvisionapi,我依赖API键已经有一段时间了,但目前我正试图给我的计算引擎的默认服务帐户提供调用Vision所需的作用域,到目前为止运气不太好。在

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

Request had insufficient authentication scopes.

我会从我的gce的editdetails选项卡中分别设置每个API的访问权限,但在其他API中却找不到列出的远景。 我能从visionapi正确接收正确响应的唯一方法是再次在gce的edit details选项卡上标记“允许对所有云API的完全访问”复选框,但这听起来不太安全。在

希望有更好的方法来做到这一点,但我找不到任何on 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(目前我正在使用GoogleAppClient.discovery.build,我不知道是否有任何方法可以通过库来请求vision api范围)。在

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

我真的找不到我的方法绕过文件,再次谢谢你。在


Tags: 方法apicloud编辑帐户解决方案作用域选项卡
1条回答
网友
1楼 · 发布于 2024-04-27 15:35:57

googlecloudapi(Vision、自然语言、翻译等)不需要任何特殊权限,您只需在项目中启用它们(转到控制台中的API Library选项卡),并创建API密钥或服务帐户来访问它们。在

考虑到Service Accounts are the recommended approach for authentication with Google Cloud Platform services,从API密钥转移到服务帐户的决定是正确的,出于安全原因,Google建议使用它们而不是API密钥。在

也就是说,我看到你使用的是旧的Python API Client Libraries,它利用了GoogleAppClient.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 ^{} module从首选SA的JSON密钥文件加载凭据,指定所需的作用域,并通过指定credentials=credentials在构建Vision客户端时使用它:

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)

编辑:

我忘了加上,为了让计算引擎实例能够与googleapi一起工作,它必须被授予https://www.googleapis.com/auth/cloud-platform范围(事实上,这与选择允许对所有云api的完全访问相同)。这是在GCE Service Accounts best practices中记录的,但是this would allow full access to all resources and services in the project是对的。在

或者,如果您担心允许“access all”作用域的含义,在this other documentation page中解释了您可以允许完全访问,然后通过IAM角色执行限制访问。在

在任何情况下,如果只想将Vision作用域授予实例,可以通过运行以下gcloud命令来实现:

^{pr2}$

云视觉API范围(https://www.googleapis.com/auth/cloud-vision)可以从this page获得,就像任何其他云API一样。在

另外,正如本节关于SA permissions and access scopes所解释的,SA权限应该与实例作用域兼容;这意味着将应用最严格的权限,因此您也需要记住这一点。在

相关问题 更多 >