如何解决“HttpError: Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object., 401”错误?

问题描述 投票:0回答:1

问题: 我正在尝试使用 google colab python 笔记本读取存储在我的项目的云存储桶之一中的 .gz JSON 文件,但我不断收到此错误:

HttpError: Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object., 401

我的代码:

fs = gcsfs.GCSFileSystem(project='my-project')
with fs.open('bucket/path.json.gz') as f:
    gz = gzip.GzipFile(fileobj=f) 
    file_as_string = gz.read()
    json_a = json.loads(file_as_string)

我已经尝试了所有这些身份验证方法,但仍然收到相同的 401 错误:

!gcloud auth login
!gcloud auth list
!gcloud projects list
!gcloud config set project 'myproject-id'

from google.colab import auth
auth.authenticate_user()

!gcloud config set account 'my GCP email'

!gcloud auth activate-service-account

!gcloud auth application-default login

!gsutil config

!gcloud config set pass_credentials_to_gsutil false

!gsutil config -a

我还将我的 GCP IAM 权限设置为:

  • 编辑器
  • 业主
  • 存储管理员
  • 存储对象管理
  • 存储对象创建器
  • 存储对象查看器
  • 存储传输管理
python json google-cloud-platform google-cloud-storage http-error
1个回答
2
投票

您的问题并不完全清楚,但是:

  1. gcloud
    和 Google SDK 都使用 Google 的身份|身份验证平台 但是它们不共享状态。您通常(!)无法使用
    gcloud
    登录并期望使用 SDK 的代码也能得到身份验证
  2. @john-hanley 正确地指出,在
    gcloud
    和使用 Google SDK 的代码之间共享状态的一种(通常令人困惑的)方法是使用
    gcloud auth application-default login
    。然而,这只有效,因为
    gcloud
    在本地写入其状态,并且使用 Google SDK 的代码在同一主机上以同一用户身份运行时将能够访问此状态。我认为(!?)这不适用于基于浏览器的协作
  3. 我不熟悉
    gcsfs.GCSFileSystem
    ,但是,它不是 Google SDK。除非其开发人员特别周到,否则它将无法利用 Google SDK 使用
    auth.authenticate_user()
    完成的身份验证。

所以...

我认为你应该:

  1. 确保您的用户帐户(
    [email protected]
    或其他)具有
    roles/storage.objectAdmin
    (或任何允许 storage.objects.get
    预定义角色
    )。
  2. 使用
    google.collab.auth
    auth.authenticate_user()
    获取浏览器登录用户的凭据(即
    [email protected]
    )。
  3. 使用 Google Cloud Storage 库,例如
    google-cloud-storage
    访问 GCS 对象。 Google 库可以利用上一步中获得的凭据。

更新

这是一个示例

注意:它使用 API 客户端库而不是云客户端库,但它们在功能上是等效的。

© www.soinside.com 2019 - 2024. All rights reserved.