代码之家  ›  专栏  ›  技术社区  ›  jeff00seattle

谷歌云API:禁止使用服务帐户密钥访问已启用的API

  •  1
  • jeff00seattle  · 技术社区  · 8 年前

    我在使用服务帐户P12密钥和获取 Http错误403 .

    但是,如果我使用Web OAuth(使用客户端ID和机密),则不会出现此问题。但是,我正在创建服务对服务应用程序。

    谷歌云API JSON 已启用。

    import os
    from httplib2 import Http
    from pprintpp import pprint
    
    from oauth2client.client import SignedJwtAssertionCredentials
    from apiclient.discovery import build
    from googleapiclient.errors import HttpError
    
    SITE_ROOT = \
        os.path.dirname(os.path.realpath(__file__))
    P12_FILE = \
        "REDACTED-0123456789.p12"
    
    P12_PATH = os.path.join(SITE_ROOT, P12_FILE)
    pprint(P12_PATH)
    
    SCOPE = \
        'https://www.googleapis.com/auth/devstorage.read_only'
    PROJECT_NAME = \
        'mobileapptracking-insights'
    BUCKET_NAME = \
        'pubsite_prod_rev_0123456789'
    CLIENT_EMAIL = \
        'REDACTED-service@foo-bar-0123456789.iam.gserviceaccount.com'
    
    private_key = None
    with open(P12_PATH, "rb") as p12_fp:
      private_key = p12_fp.read()
    
    credentials = SignedJwtAssertionCredentials(
        CLIENT_EMAIL,
        private_key,
        SCOPE)
    
    http_auth = credentials.authorize(Http())
    
    storage = build('storage', version='v1', http=http_auth)
    
    request = storage.objects().list(bucket=BUCKET_NAME)
    
    try:
        response = request.execute()
    except HttpError as error:
        print("HttpError: %s" % str(error))
        raise
    except Exception as error:
        print("%s: %s" % (error.__class__.__name__, str(error)))
        raise
    
    print(response)
    

    错误消息:

    HttpError: <HttpError 403 when requesting https://www.googleapis.com/storage/v1/b/pubsite_prod_rev_0123456789/o?alt=json returned "Forbidden">
    

    我需要做什么来解决这个问题?

    2 回复  |  直到 8 年前
        1
  •  1
  •   jerjou    8 年前

    您的代码看起来很好(我刚刚粘贴了它,更改了适当的常量,并成功运行了它)。

    我会仔细检查:

    • 您的客户端电子邮件是p12密钥的正确电子邮件
    • 该服务帐户可以访问您列出的存储桶

    您可以做一些其他事情来帮助您找出问题所在:

    • 验证您是否可以列出公众 uspto-pair 水桶
    • import httplib2 并设置 httplib2.debuglevel = 1 ,并验证正在发出的请求是否为预期请求。
        2
  •  0
  •   jeff00seattle    8 年前

    问题是我没有通过 Google Play开发者控制台>设置>用户帐户和;权利