我正在尝试通过委托服务帐户凭据以编程方式访问我品牌帐户的 Youtube 报告数据,但在弄清楚如何操作时遇到了一些真正的麻烦。
到目前为止,我已经成功运行委托 API 请求而无需提供onBehalfOfContentOnwer(即返回该帐户的正确数据),所以我知道服务帐户委托是可行的并且配置正确。但是,当尝试使用委派帐户有权访问的 onBehalfOfContentOnwer 获取内容所有者的数据时,出现以下错误。
我还验证了我的代表团电子邮件地址确实有权以编程方式查询品牌帐户的数据,因为已经能够使用 Youtube 文档的“自己尝试”部分成功地向内容所有者/品牌帐户的数据发出请求,并且在 oauth 操场上。有没有办法针对所需的品牌帐户构建令牌?或者我还缺少其他东西?
from google.oauth2 import service_account
import googleapiclient.discovery
SCOPES = [
'https://www.googleapis.com/auth/youtube',
'https://www.googleapis.com/auth/yt-analytics-monetary.readonly',
'https://www.googleapis.com/auth/yt-analytics.readonly'
]
credentials = service_account.Credentials.from_service_account_info(
service_account_cred,
scopes=SCOPES,
subject='[email protected]'
)
credentials.refresh(
google.auth.transport.requests.Request())
youtube_reporting = googleapiclient.discovery.build(
'youtubereporting', 'v1', credentials=credentials)
print(youtube_reporting.reportTypes().list(onBehalfOfContentOwner='mycontentownerid').execute())
googleapiclient.errors.HttpError:
https://youtubereporting.googleapis.com/v1/reportTypes?onBehalfOfContentOwner=mycontentenownerid&alt=json 返回“调用者没有权限”。详情:“来电者无权限”>
为避免使用服务帐户设置计划查询时权限被拒绝,请按照以下步骤操作:
roles/bigquery.admin 包括安排或修改查询所需的所有 IAM 权限。即服务帐户应具有这些权限。
要创建或更新由服务帐户运行的计划查询,正在修改的用户必须通过具有 服务帐户用户角色 来访问服务帐户本身。可以在项目级别或服务帐户级别分配此角色。即用户应该有这个权限
注意: 当以编程方式创建计划查询时,服务帐户有时可以是调用 SA 的用户。在这种情况下,可以做 3 件事中的 1 件事:
A. 授予服务帐户服务帐户用户角色以访问其自身
B. 从请求中删除 service_account_name
C. 使用不同的凭据
3。如果这些权限都已分配,并且仍然存在权限被拒绝的错误,则可能正在执行组织策略,请检查以下步骤:
a. “禁用跨项目服务帐户使用”策略默认在项目级别强制执行。您可以转到 IAM 和管理 —> 组织策略 —> 搜索服务帐户。
b. 每个服务帐户都位于一个项目中。你可以去 IAM & Admin —> Service Accounts —> 搜索服务账户,看看它是否位于某个项目中
c. 要跨项目使用服务帐户,您必须在服务帐户所属的项目中禁用该策略:
$ gcloud resource-manager org-policies disable-enforce
iam.disableCrossProjectServiceAccountUsage --project=[PROJECT-ID]
d. 要禁用此策略,需要将用户添加为 Organization Policy Administrator。只有组织管理员才能授予此角色。