我有一个任务,导入视频的视频细节,上传到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);
}
希望这能解决你的问题