google.cloud.storage 允许访问,但 gcsfs 不允许

时间:2021-06-17 18:43:15

标签: python authentication google-cloud-platform google-cloud-storage

我想使用 gcsfs 连接到 Google Cloud 存储上的存储分区。到目前为止,我只使用了本机 google.cloud 模块,但事实证明我实际上需要某个应用程序的文件之类的对象,因此不得不切换。

我的 GOOGLE_APPLICATION_CREDENTIALS 环境变量指向我本地文件系统上的 JSON 文件。使用 google.cloud,我可以毫无问题地访问云存储中的存储桶。但是使用 gcsfs 我不是。下面是一些代码来说明我的意思:

from google.cloud import storage
import gcsfs
import google.auth

storage_client = storage.Client()
bucket = storage_client.bucket(...)
blob = bucket.blob(f'data/audio_wav/test.wav')
bts = blob.download_as_bytes()

credentials, _ = google.auth.default()
fs = gcsfs.GCSFileSystem(project=..., token=credentials)
folders = fs.ls('data') #throws error

正如所评论的,最后一行抛出似乎是一个身份验证错误:

<块引用>

google.auth.exceptions.RefreshError: ('invalid_scope: 提供的 OAuth 范围或 ID 令牌受众无效。', {'error': 'invalid_scope', 'error_description': '提供的 OAuth 范围或 ID 令牌受众无效。' })

我认为如果 google.cloud.storage 接受我的凭据,那么 gcsfs 也应该接受。为什么会出现上述错误,我该如何解决?

或者,有没有办法使用 google.cloud.storage 而不是 gcsfs 打开类似对象的文件?

JSON 文件

{
  "type": "service_account",
  "project_id": ...,
  "private_key_id": ....,
  "private_key": ...,
  "client_email": "ai-dj-884@ai-dj-76527.iam.gserviceaccount.com",
  "client_id": "113487991001810308893",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/ai-dj-884%40ai-dj-76527.iam.gserviceaccount.com"
}

1 个答案:

答案 0 :(得分:0)

正如@John Hanley 在评论中建议的那样,将身份验证模式(即“令牌”)从“token=credentials”修改为“token=None”,以使用您的默认 gcloud 凭据,或者尝试从 Google 获取凭据元数据服务,或回退到匿名访问。

有关详细信息,请参阅 Credentials

要使用“google.cloud.storage”而不是“gcsfs”打开文件,您可以使用以下方法,

#create storage client  
storage_client = storage.Client('json-file-path’')  
#get bucket with name  
bucket = storage_client.get_bucket('bucket-name')  
#get bucket data as blob  
blob = bucket.get_blob('file-name’)