Authorization 无法获得使用Python客户端库API处理GCS脚本的服务帐户授权

Authorization 无法获得使用Python客户端库API处理GCS脚本的服务帐户授权,authorization,google-cloud-storage,google-api-python-client,service-accounts,Authorization,Google Cloud Storage,Google Api Python Client,Service Accounts,在尝试编写python脚本以使用基于服务的授权访问GCS时,我想到了以下几点。请注意,“key”是我的p12文件的内容 我正在尝试读取我帐户上的存储桶列表。我已经使用GCS的web界面成功地创建了一个bucket,并且可以通过gsutil看到这一点 当我执行下面的代码时,我得到一个403错误。起初我认为我没有得到正确的授权,但我尝试了这个非常有用的网页(它使用基于web的授权),它工作正常&_h=2& 当我查看标题和查询字符串并将它们与网站生成请求的keaders和query进行比较时,我发现没

在尝试编写python脚本以使用基于服务的授权访问GCS时,我想到了以下几点。请注意,“key”是我的p12文件的内容

我正在尝试读取我帐户上的存储桶列表。我已经使用GCS的web界面成功地创建了一个bucket,并且可以通过gsutil看到这一点

当我执行下面的代码时,我得到一个403错误。起初我认为我没有得到正确的授权,但我尝试了这个非常有用的网页(它使用基于web的授权),它工作正常&_h=2&

当我查看标题和查询字符串并将它们与网站生成请求的keaders和query进行比较时,我发现没有授权标题,并且查询字符串中没有key=tag。我想我以为凭证授权会帮我解决这个问题

我做错了什么

代码:


当我尝试执行时,我得到403

我成功了,但是,我使用的代码与您发布的代码片段没有本质上的区别。为了以防万一,你想把我的版本和你的版本区别开来,下面附上一个为我工作的Python程序的完整副本。我最初得到了403,就像您一样,这是由于继承了您的项目id:)。在更新该值以使用我的项目ID之后,我得到了一个正确的bucket列表。有两件事需要检查:

  • 确保您使用的项目id是正确的,并且在Google开发者控制台“服务”选项卡上启用了“Google云存储JSON API”(这是与其他Google云存储API不同的服务)

  • 确保加载的服务帐户私钥与来自开发人员控制台的私钥完全相同。我建议将它从下载的文件中读入内存,就像我在这里所做的那样,而不是在代码中尝试将它复制成字符串文字



  • 你在AppEngine上吗?如果没有,您是否尝试过像建议中那样使用boto?谢谢您修复我的格式!我采用这种方法是因为boto不支持服务帐户身份验证。这适用于在设备(安全摄像头)上本地运行的独立服务,而不是AppEngine用例。摄像机将其媒体上传到地面军事系统。嗨,马克,谢谢你的积极回应。我最初认为问题在于我没有启用GCS JSON API,但后来我从上面提到的网页上得到了一个OK和一个bucket列表。可能该页面使用了不同的身份验证方案。。。我昨天请求访问JSON API,但尚未获得授权。当我得到批准后,我会再试一次。如果你说的网页是指谷歌云存储web UI,它使用的是旧的XML API,而不是新的JSON API,因此不必通过JSON API验证你的访问。鉴于你昨天请求访问,我打赌那是你的问题。不管怎样,如果你不能很快获得访问权限,或者无法获得访问权限,请在此处发表评论。谢谢Marc-刚刚获得批准,并且按照预期工作。我被抛出是因为基于web的api explorer()返回JSON,所以我假设它使用的是JSON api。欢迎
    credentials = SignedJwtAssertionCredentials(
          'xxx-my-long-email-from-the-console@developer.gserviceaccount.com',
          key,
          scope='https://www.googleapis.com/auth/devstorage.full_control')
    http = httplib2.Http()
    http = credentials.authorize(http)
    
    service = build("storage", "v1beta1", http=http)
    
    # Build the request
    
    request = service.buckets().list(projectId="159910083329")
    
    # Diagnostic
    
    pprint.pprint(request.headers)
    pprint.pprint(request.to_json())
    
    # Do it!
    
    response = request.execute()
    
    #!/usr/bin/env python
    
    import pprint
    import oauth2client
    from oauth2client.client import SignedJwtAssertionCredentials
    import httplib2
    from apiclient.discovery import build
    
    f = open('key.p12', 'r')
    key = f.read()
    f.close()
    
    credentials = SignedJwtAssertionCredentials(
          'REDACTED',
          key,
          scope='https://www.googleapis.com/auth/devstorage.full_control')
    http = httplib2.Http()
    http = credentials.authorize(http)
    
    service = build("storage", "v1beta1", http=http)
    
    # Build the request
    
    request = service.buckets().list(projectId="REDACTED")
    
    # Diagnostic
    
    pprint.pprint(request.headers)
    pprint.pprint(request.to_json())
    
    # Do it!
    
    response = request.execute()
    pprint.pprint(response)