繁体   English   中英

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

[英]compute engine's service account has insufficient scopes for cloud vision api

我需要在我的 python 解决方案中使用 Cloud Vision API,我已经依赖 API 密钥一段时间了,但目前我正在尝试为我的计算引擎的默认服务帐户提供调用 Vision 所需的 scope,到目前为止运气不佳。

我通过云控制台在我的项目中启用了 vision API,但我仍然收到 403 错误:

请求的身份验证范围不足。

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

希望有更好的方法来做到这一点,但我在 Vision 的身份验证文档中找不到任何内容,也找不到关于堆栈溢出的任何问题(有些主题很接近,但没有一个建议的答案非常适合我的情况,或提供一个可行的解决方案)。

预先感谢您的帮助。

来自 goole 云控制台的 gce 编辑详细信息选项卡


编辑

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

大查询; 大表管理员; 大表数据; 云数据存储; 云调试器; 云发布/订阅; 云源存储库; 云 SQL; 计算引擎; 服务控制; 服务管理; Stackdriver 日志记录 API; Stackdriver 监控 API; Stackdriver 跟踪; 贮存; 任务队列; 用户信息

它们似乎都对我的需求没有用,尽管启用对它们的完全访问全部解决了我的问题这一事实让我很困惑。


编辑#2

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

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

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

我真的找不到解决文档的方法,再次感谢您。

Google Cloud API(视觉,自然语言,翻译等)不需要任何特殊权限,您只需在项目中启用它们(转到控制台中的“ API库”标签),然后创建一个API密钥或一个服务帐户即可访问他们。

考虑到服务帐户是使用Google Cloud Platform服务进行身份验证的推荐方法 ,并且出于安全原因,您建议使用它们而不是API密钥,因此决定从API密钥转移到服务帐户是正确的选择。

话虽如此,我看到您正在使用旧的Python API客户端库 ,该利用了您提到的googleapiclient.discovery.build服务。 到目前为止,推荐使用较新的惯用客户端库 ,并且它们已取代您正在使用的旧版API客户端库,因此,我强烈建议您朝这个方向发展。 它们更易于使用,更易理解,文档更丰富,是推荐以编程方式访问Cloud API的方法

以此为起点,我将这个答案分为两部分:

使用客户端库

如果您决定遵循我的建议并迁移到新的客户端库,则由于客户端库使用应用程序默认凭据(ADC)进行身份验证,因此身份验证将非常容易。 ADC使用Compute Engine的默认服务帐户来提供身份验证,因此您完全不必担心它,因为它将默认运行。

明确这一部分后,您可以继续创建示例代码(例如文档中提供的示例代码),并且一旦测试一切正常,就可以继续使用完整的Vision API客户端库。参考页以获取有关库工作方式的信息。

使用(旧式)API客户端库如果不顾我的话,如果您仍想使用旧的API客户端库,那么您可能会对另一个文档页面感兴趣,该页面上有一些有关使用API​​客户端库进行身份验证的完整信息。 更具体地说,整整一章专门介绍使用服务帐户进行OAuth 2.0身份验证

使用下面的简单代码,您可以使用google.oauth2.service_account模块 ,以便从首选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服务帐户最佳实践对此 进行了记录 ,但是您完全正确,因为它可以完全访问项目中的所有资源和服务

或者,如果您担心允许“全部访问”范围的含义,则在此其他文档页面中解释说,您可以允许完全访问,然后通过IAM角色执行限制访问。

在任何情况下,如果要授予视觉范围的情况下,你可以通过运行下面这样做gcloud命令:

gcloud compute instances set-service-account INSTANCE_NAME --zone=INSTANCE_ZONE --scopes=https://www.googleapis.com/auth/cloud-vision

与任何其他Cloud API一样,可从此页面获取Cloud Vision API范围( https://www.googleapis.com/auth/cloud-vision )。

此外,如本节中有关SA权限和访问范围的说明所述 ,SA权限应与实例范围兼容;例如, 这意味着将应用最严格的权限,因此您也需要牢记这一点。

要从 python 客户端库设置访问范围,其效果与 GUI 中的单选按钮相同:

instance_client = compute_v1.InstancesClient()
instance.service_accounts = [
    compute_v1.ServiceAccount(
        email="$$$$$$$-compute@developer.gserviceaccount.com",
        scopes=[
            "https://www.googleapis.com/auth/compute",
            "https://www.googleapis.com/auth/cloud-platform",
        ],
    )
]

此处提供从 python 创建实例的教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM