我的任务是导入在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?
答案 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);
}
希望这可以解决您的问题。