У меня есть задача импортировать детали видео из видео, загруженных на YouTube.
У меня есть аккаунт, то есть владелец видео. У меня есть учетные данные настройки в консоли: https://console.developers.google.com/project/XXXXX/apiui/credential. Я создал сервисную учетную запись OAuth там.
Далее в скрипте я использую код из документации (версия API версии 3):
$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 Javascript на странице документации. Домен другой, клиент Javascript передает больше заголовков и т. Д.
Как мне заставить его работать с PHP?
Вы должны добавить onBehalfofContentOwner Параметр для вашего запроса, чтобы показать себя в качестве владельца контента.
Вы, кажется, использовали учетные данные учетной записи службы Google для аутентификации. Вызов API необходимо выполнить после аутентификации как «Идентификатор клиента для веб-приложения», а не как учетная запись службы. После создания нового набора учетных данных для веб-приложения выполните аутентификацию следующим образом:
$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);
}
Надеюсь, что это решит вашу проблему.