【问题标题】:Youtube Analytics API returns 403 forbidden even if token is valid即使令牌有效,Youtube 分析 API 也会返回 403 禁止
【发布时间】:2018-11-08 00:09:04
【问题描述】:

我在访问随机 youtube 频道的 Youtube Analytics API 时遇到问题。

在以下范围内成功授权后:

我将tokenrefresh token 保存在数据库中。一段时间内一切正常。一段时间后(例如三个月),当我的应用发出请求时,Google 返回 403:

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "forbidden",
        "message": "Forbidden"
      }
    ],
    "code": 403,
    "message": "Forbidden"
  }
}

但仅适用于 Youtube 分析 API,Youtube 数据 API 中的其他端点可以正常使用此令牌。 随机帐户(频道)会发生这种情况。此频道的所有者没有撤销对我的应用的访问权限,也没有更改帐户密码等。

这个问题影响了我的应用程序中大约 40% 的通道(Youtube Analytics API 停止工作的时间不同,从获得 OAuth2 令牌后的 1 到 6 个月)。然后我必须定期向他们发送一个新的授权网址。

问题出在哪里?

这就是我生成身份验证 URL 并发出请求的方式:

  • 授权网址:

    flow = client.flow_from_clientsecrets(
        secret_file_path,
        scope=["https://www.googleapis.com/auth/youtube.readonly",
               "https://www.googleapis.com/auth/yt-analytics.readonly"],
        redirect_uri=redirect_url,
        prompt="consent"
    )
    flow.params["access_type"] = "offline"
    url = flow.step1_get_authorize_url(state=state)
    
  • 统计请求:

    auth = client.OAuth2Credentials.from_json(credentials_from_db)
    http_auth = auth.authorize(httplib2.Http())
    api = discovery.build("youtubeAnalytics", "v1", http=http_auth,
                       cache_discovery=False)
    api.reports().query(
        ids="channel==%s" % channel_id,
        metrics="estimatedMinutesWatched",
        dimensions="video",
        start_date=start_date,
        end_date=end_date,
        max_results=20,
        filters="video=={}".format(",".join(video_ids))
    ).execute(http=http)
    

我使用的是 google-api-python-client 1.6.5

编辑

我在使用google-api-python-client 调试对 google API 的请求时附上了屏幕截图。这是发生了什么:

  1. 使用 Youtube Data API 检索频道的基本统计数据
  2. 使用 Youtube Analytics API 检索频道的高级统计数据

我的意思是,刷新令牌在这两种情况下都已成功交换,但仅适用于 Youtube Data API。我特意换了两次。同样的结果是当我通过一次成功的令牌交换(不调用 Youtube Data API)只访问 Youtube Analytics API 时。

最有趣的是,这段代码可以运行一段时间(几周或几个月)然后停止:-)

【问题讨论】:

  • API请求有没有配额限制之类的?我这样说是因为在使用 Google Cloud Vision API 时我遇到了类似的问题:因为我在那个时间范围内用尽了我的配额。
  • @unholy_me 限制很好,大约 30-40% 的使用率(适用于所有限制)。
  • 您使用这些用户的刷新令牌调用 api 的频率如何?
  • @DaImTo 视情况而定;有时一周一次,有时一天一次。然而,在所有情况下,刷新令牌总是成功地交换为身份验证令牌(我调试了它:-)。
  • 您经常使用它来调用这两个 API?用户是否可以多次验证您的应用程序?是否可以进行多个安装?

标签: python google-api youtube-api google-api-python-client youtube-analytics-api


【解决方案1】:

鉴于您说令牌刷新有效但 API 调用返回错误,我唯一怀疑的是 api 方面的一些问题。

您是否从您的服务器进行这些 API 调用?有多少用户?您可能会遇到基于 IP 的限制。我不确定。

我认为找到问题的最简单方法是向我们发送一些开始返回错误的令牌。我们可以查找令牌是否无效或 API 端是否存在问题。 您可以通过电子邮件将其发送至 oauth-help@google.com

【讨论】:

  • 谢谢nvnagr。我将发送一封包含有问题的令牌和频道的电子邮件。
【解决方案2】:

好的,让我们从一些背景信息开始。

刷新令牌停止工作的原因有多种。

  1. 如果不使用,旧的刷新令牌会在六个月后过期。
  2. 用户可以重新验证您的应用程序并获取新的刷新令牌,这两个刷新令牌都可以使用,您最多可以拥有 50 个未完成的刷新令牌,然后第一个将停止工作。
  3. 用户可以撤销您的访问权限。
  4. 2015 年的唤醒夏令时错误。(我们不会谈论那个)

现在这一切都不是你的情况。为什么因为刷新令牌仍然有效,您只是降低了范围。用户无法删除您对一个范围的访问权限并且不会使一个范围过期,这太疯狂了。

话虽如此,我正在导致这是一个错误。我已向我认识的 Oauth 团队成员发送了一封电子邮件。

与此同时。我有个主意?

如果您尝试使用刷新令牌请求新的访问令牌,会发生什么情况?会不会是返回给您的访问令牌有问题?

【讨论】:

  • 感谢您的承诺。我通过添加有关请求和结果的更多信息来编辑我的第一篇文章。我尝试在没有google-api-python-client 的情况下发出请求,但结果是一样的。
  • 这与客户端库无关。这是身份验证服务器问题。检查另一个答案 @nvnagr 来自 Google Oauth 团队
猜你喜欢
  • 2017-05-08
  • 2016-03-02
  • 1970-01-01
  • 2013-05-12
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 2015-06-03
相关资源
最近更新 更多