Google 云 API:禁止使用服务帐户密钥访问已启用 API
Google Cloud API: Forbidden to access Enabled API using Service Account key
我在使用服务帐户 P12 密钥时遇到问题并收到 HttpError 403。
但是,如果我使用使用客户端 ID 和密钥的 Web OAuth,则不会出现此问题。但是,我正在创建服务到服务应用程序。
Google 云 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">
我需要做什么来解决这个问题?
您的代码看起来不错(我只是粘贴它,更改了适当的常量,并成功 运行 它)。
我会仔细检查:
- 您的客户电子邮件是 p12 密钥的正确电子邮件
- 该服务帐户可以访问您列出的存储桶
您可以做一些其他事情来帮助您找出问题所在:
- 确认您可以列出 public
uspto-pair
存储桶
import httplib2
并设置 httplib2.debuglevel = 1
,并验证正在发出的请求是否符合预期。
问题是我没有通过 Google Play Developers Console > Settings > USER ACCOUNTS & RIGHTS 分配对服务 'client email' 的访问权限
我在使用服务帐户 P12 密钥时遇到问题并收到 HttpError 403。
但是,如果我使用使用客户端 ID 和密钥的 Web OAuth,则不会出现此问题。但是,我正在创建服务到服务应用程序。
Google 云 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">
我需要做什么来解决这个问题?
您的代码看起来不错(我只是粘贴它,更改了适当的常量,并成功 运行 它)。
我会仔细检查:
- 您的客户电子邮件是 p12 密钥的正确电子邮件
- 该服务帐户可以访问您列出的存储桶
您可以做一些其他事情来帮助您找出问题所在:
- 确认您可以列出 public
uspto-pair
存储桶 import httplib2
并设置httplib2.debuglevel = 1
,并验证正在发出的请求是否符合预期。
问题是我没有通过 Google Play Developers Console > Settings > USER ACCOUNTS & RIGHTS 分配对服务 'client email' 的访问权限