Google API 授权(服务帐户)错误:HttpAccessTokenRefreshError:未授权客户端:请求中的未授权客户端或范围

Posted

技术标签:

【中文标题】Google API 授权(服务帐户)错误:HttpAccessTokenRefreshError:未授权客户端:请求中的未授权客户端或范围【英文标题】:Google API Authorization (Service Account) Error: HttpAccessTokenRefreshError: unauthorized_client: Unauthorized client or scope in request 【发布时间】:2017-02-22 23:36:26 【问题描述】:

我正在尝试使用 Python 连接到 YouTube Analytics API。当我转到凭据选项卡中的 Google 开发人员控制台时,我单击 Create credentials 下拉菜单并选择 Help me choose。我点击我想使用的 API (YouTube Analytics API),我将从那里调用 (Other non-UI (e.g. cron job, daemon)),我将访问哪些数据 (Application Data),然后我是否使用 Google App Engine ( no)。我点击按钮查看我需要哪些凭据,它会告诉我You alread have credentials that are suitable for this purpose

我有一个 Service account 用于连接到 Google Search Console API 以访问我公司拥有的多个网站的数据。因为我们有多个站点,所以我根据我的电子邮件地址使用委托凭据。这是我用来向 Search Console API 进行身份验证的代码:

from httplib2 import Http
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build

scopes = ['https://www.googleapis.com/auth/webmasters.readonly']
credentials = ServiceAccountCredentials.from_json_keyfile_name('keyfile.json', scopes=scopes)

delegated_credentials = credentials.create_delegated('<my-email>')
http_auth = delegated_credentials.authorize(Http())

webmasters_service = build('webmasters', 'v3', http=http_auth)

现在,我正在尝试对 YouTube 分析 API 使用类似的方法,但出现此错误:HttpAccessTokenRefreshError: unauthorized_client: Unauthorized client or scope in request.。这是我的代码:

from httplib2 import Http
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build

START_DATE = "2016-09-01"
END_DATE = "2016-09-30"

scopes = ['https://www.googleapis.com/auth/yt-analytics.readonly']
credentials = ServiceAccountCredentials.from_json_keyfile_name('keyfile.json', scopes=scopes)

delegated_credentials = credentials.create_delegated('<my-email>')
http_auth = delegated_credentials.authorize(Http())

youtube_service = build('youtubeAnalytics', 'v1', http=http_auth)

analytics_query_response = youtube_service.reports().query(
    ids="channel==<my-youtube-channel-id>",
    metrics="views",
    start_date=START_DATE,
    end_date=END_DATE
).execute()

keyfile.json 是我用来连接到 Search Console API 的同一个文件(包含服务帐户凭据)。我什至尝试创建一个新的服务帐户并使用这些凭据,但我没有任何运气。是的,我已经在开发者控制台中启用了所有的 YouTube API。

你知道我为什么会收到HttpAccessTokenRefreshError: unauthorized_client: ... 错误吗?

编辑:以前我使用 OAuth ID 而不是服务帐户,当我运行我的脚本时,会出现一个浏览器选项卡,我必须选择一个帐户。我看到了两个选项:一个是我的电子邮件,另一个是我被添加为经理的 YouTube 帐户。您认为我收到该错误是因为我使用我的电子邮件地址(而不是 YouTube 帐户)来生成凭据吗?

edit2:YouTube 帐户似乎不属于我们的 Google Apps 域。因此,这可能就是我无法授权使用我的电子邮件地址的原因,即使我已成为使用该电子邮件地址的 YouTube 帐户的管理员。

【问题讨论】:

您是否启用了通过您的 IP 从控制台访问 @UnknownDeveloper 我不知道该怎么做,但是在连接到 Google Search Console API 时我不会遇到同样的错误吗?我对 Search Console API 没有任何问题,只有 YouTube Analytics API。仅供参考,我在我的问题中添加了更多信息,描述了我使用 OAuth 方法时发生的情况。 【参考方案1】:

我在此 documentation 上发现您无法将服务帐户与 YouTube Analytics API 一起使用。

这里说:

服务帐户流支持服务器到服务器的交互, 不要访问用户信息。但是,YouTube 分析 API 不支持此流程。由于无法链接服务 帐户到 YouTube 帐户,尝试使用此授权请求 flow 会产生错误。

我还在这个由 Google 员工回答的 thread 中找到了它。

欲了解更多信息,请查看此SO question。

【讨论】:

不错的发现,肯迪!在阅读授权文档的服务帐户部分时,我没有注意到这一点。那么,我是否必须使用 OAuth 进行身份验证?这可能来自运行 cron 作业的服务器吗?

以上是关于Google API 授权(服务帐户)错误:HttpAccessTokenRefreshError:未授权客户端:请求中的未授权客户端或范围的主要内容,如果未能解决你的问题,请参考以下文章

Google API 授权(服务帐户)错误:HttpAccessTokenRefreshError:未授权客户端:请求中的未授权客户端或范围

Google API 服务帐号授权错误

Google OAuth2 服务帐户 API 授权

使用服务帐户在 Google Analytics API 中未经授权的假冒用户

使用服务帐户通过 OAuth 2.0 调用 v3 Google 日历 API 时出现“需要登录”401 未经授权的消息

perl 中的 google API 服务帐户流程