【问题标题】:YouTube Data API: authenticate as a resource ownerYouTube 数据 API:作为资源所有者进行身份验证
【发布时间】:2015-08-23 06:13:43
【问题描述】:

我的任务是导入上传到 YouTube 上的视频的视频详细信息。

我有一个帐户,即视频所有者。我在控制台中有设置凭据:https://console.developers.google.com/project/XXXXX/apiui/credential。我在那里创建了 OAuth 服务帐户。

稍后在脚本中我使用文档中的代码(API 的 v3 版本):

    $credentials = new Google_Auth_AssertionCredentials(
        $clientEmail,
        [
            'https://www.googleapis.com/auth/youtube',
            'https://www.googleapis.com/auth/youtube.force-ssl',
            'https://www.googleapis.com/auth/youtube.readonly',
            'https://www.googleapis.com/auth/youtubepartner',
        ],
        $privateKeyContents
    );
    $this->client->setAssertionCredentials($credentials);

    /** @var Google_Auth_OAuth2 $auth */
    $auth = $this->client->getAuth();

    if ($auth->isAccessTokenExpired()) {
        $auth->refreshTokenWithAssertion();
    }

身份验证工作正常。我已将记录器附加到 Google 客户端,我可以看到每个请求都传递了 Authorization: Bearer XXXXXXX 标头。

但问题在于,YouTube 似乎并未将此身份验证视为对实际资源所有者的身份验证。例如,如果我请求 Video Snippet,它会返回不带标签(出于某种原因标签只能由所有者看到)。

如果我从这里https://developers.google.com/youtube/v3/docs/videos/list?hl=ru 提出相同的请求,它会完美运行。

可能是什么问题?

日志中的请求如下所示:

[2015-06-08 14:50:02] name.DEBUG: OAuth2 authentication [] []
[2015-06-08 14:50:02] name.DEBUG: cURL request {"url":"https://www.googleapis.com/youtube/v3/playlists?part=id%2Csnippet&channelId=XXXXXXXXXXXX&maxResults=50","method":"GET","headers":{"authorization":"Bearer ya29.XXXXX-XXXXXX","accept-encoding":"gzip"},"body":null} []

这与我在跟踪 Google Javascript 客户端在文档页面上发出的请求时看到的不同。域不同,Javascript客户端传递更多的headers等。

如何使它与 PHP 一起工作?

【问题讨论】:

    标签: php google-api youtube-api youtube-data-api google-api-php-client


    【解决方案1】:

    您应该在请求中添加onBehalfofContentOwner 参数,以显示您自己是内容所有者。

    【讨论】:

    • 很遗憾,我不是 YouTube 内容合作伙伴。
    【解决方案2】:

    您似乎一直在使用 Google 服务帐户凭据进行身份验证。 API 调用需要在验证为“Web 应用程序的客户端 ID”而不是服务帐户后进行。为 Web 应用程序创建一组新凭据后,按如下方式进行身份验证:

    $OAUTH2_CLIENT_ID = 'REPLACE_ME';
    $OAUTH2_CLIENT_SECRET = 'REPLACE_ME';
    
    $client = new Google_Client();
    $client->setClientId($OAUTH2_CLIENT_ID);
    $client->setClientSecret($OAUTH2_CLIENT_SECRET);
    $client->setScopes('https://www.googleapis.com/auth/youtube');
    $redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'],
        FILTER_SANITIZE_URL);
    $client->setRedirectUri($redirect);//This Uri should match exactly to what you had given in Google Developer Console while generating Client ID/Secret
    
    // Define an object that will be used to make all API requests.
    $youtube = new Google_Service_YouTube($client);
    
    if (isset($_GET['code'])) {
      if (strval($_SESSION['state']) !== strval($_GET['state'])) {
        die('The session state did not match.');
      }
    
      $client->authenticate($_GET['code']);
      $_SESSION['token'] = $client->getAccessToken();
      header('Location: ' . $redirect);
    }
    

    希望这能解决您的问题。

    【讨论】:

    • 我的视频导入是自动的。我不能在那里使用任何重定向 URL。您描述的 OAuth 流程仅用于人工交互。
    • @VladislavRastrusny:我理解,但您尝试进行的 API 调用需要人工交互。我从API page 中获取了代码示例。这就是为什么当您尝试使用 API Explorer 时,API 调用会成功。由于您正在尝试获取用户的资源(在这种情况下为视频),因此用户的显式身份验证是强制性的。
    • 我明白了,感谢您的澄清,但这仍然不能解决我的问题。我需要使用 PHP 和自动化脚本作为资源所有者进行身份验证。
    • @VladislavRastrusny:由于视频资源与特定用户相关联,因此如果没有需要显式用户访问的手动 OAuth 工作流程,您无法访问此数据。您可以做的是在第一个 OAuth 周期保存用户 Access_Token 和 Refresh Token,然后将其用于 API 的后续请求,几乎无限期地使用相同的访问/刷新令牌。
    • 我不明白为什么我不能 ;) 我仍在使用 Google_Auth_OAuth2 流,只是与另一个流一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    相关资源
    最近更新 更多