YouTube Data API:作为资源所有者进行身份验证

时间:2015-06-08 16:52:16

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

我的任务是导入在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认为此身份验证不是对实际资源所有者的身份验证。例如,如果我请求视频片段,则返回时不带标签(标签只能由所有者查看)。

如果我从这里发出相同的请求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文档页面上跟踪Google Javascript客户端发出的请求时所看到的不同。域名不同,Javascript客户端传递更多标题等。

如何使用PHP?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您似乎一直在使用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);
}

希望这可以解决您的问题。