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


YouTube Data API: authenticate as a resource owner

我有一个任务,导入视频的视频细节,上传到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();
    }

身份验证工作正常。我已经将记录器连接到谷歌客户端,我可以看到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} []

这不同于我可以看到,如果跟踪请求谷歌Javascript客户端在文档页面。域名不同,Javascript客户端传递更多报头等

如何让它在PHP中工作?

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

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

希望这能解决你的问题