У меня есть приложение, которое может загружать видео в мой аккаунт YouTube, но после обновления до YouTube API v3 ситуация усложняется.
он использовал эту реализацию https://developers.google.com/youtube/2.0/developers_guide_protocol_browser_based_uploading
Авторизация Youtube ранее выглядела так.
$postData = "Email=".urlencode(Config::$youtubeEmail)."&Passwd=".urlencode(Config::$youtubePassword)."&service=youtube&source=".urlencode(Config::$youtubeAppName);
$curl = curl_init("https://www.google.com/youtube/accounts/ClientLogin");
curl_setopt($curl,CURLOPT_HEADER,"Content-Type:application/x-www-form-urlencoded");
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,$postData);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,1);
$response = curl_exec($curl);
curl_close($curl);
//print_r($response);exit();
list($this->auth,$this->youtubeUser) = explode("\n",$response);
list($this->authLabel,$this->authValue) = array_map("trim",explode("=",$this->auth));
list($this->youtubeUserlabel,$this->youtubeUserValue) = array_map("trim",explode("=",$this->youtubeUser));
Я получил токен авторизации, который использовался для создания токена авторизации на аккаунте YouTube, и было возможно загрузить видео через форму
$youtubeVideoKeywords = ""; // This is the uploading video keywords.
$youtubeVideoCategory = $this->getVideoCategory(); // This is the uploading video category. There are only certain categories that are accepted. See below the method
$data = '<?xml version="1.0"?'.'>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007">
<media:group>
<media:title type="plain">'.stripslashes($youtubeVideoTitle).'</media:title>
<media:description type="plain">'.stripslashes($youtubeVideDescription).'</media:description>
<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">'.$youtubeVideoCategory.'</media:category>
<media:keywords>'.$youtubeVideoKeywords.'</media:keywords>
</media:group>
<yt:accessControl action="list" permission="denied"/>
</entry>';
$headers = array(
'Authorization: Bearer ' . $this->authValue,
'GData-Version: 2',
'X-GData-Key: key=' . Config::$youtubeDevKey,
'Content-Type: application/atom+xml; charset=UTF-8'
);
$curl = curl_init("http://gdata.youtube.com/action/GetUploadToken");
curl_setopt($curl,CURLOPT_USERAGENT,$_SERVER["HTTP_USER_AGENT"]);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_TIMEOUT,10);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headers);
curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
curl_setopt($curl,CURLOPT_REFERER,true);
curl_setopt($curl,CURLOPT_HEADER,0);
$response = simplexml_load_string(curl_exec($curl));
curl_close($curl);
return $response;
Мне не нужно было никакого разрешения на загрузку видео, пользователь использовал только форму, в которой был написан заголовок, описание и т. Д., Снял видео с компьютера и нажал на кнопку загрузки. Все было хорошо, пользователи могли загружать видео на мой канал на YouTube. пользователи довольны, потому что не было дополнительного входа в систему.
Но теперь, когда я делаю запрос curl https://www.google.com/youtube/accounts/ClientLogin он говорит, что мне нужен сервис аутентификации oauth2.0.
Поэтому я сгенерировал секреты oauth2 для своего сервиса, внес изменения в код, но когда пользователь хочет использовать это приложение, ему необходимо войти в учетную запись Google и разрешить использование веб-приложения.
Новый фрагмент кода:
Когда пользователь хочет загрузить видео, я проверяю код авторизации от oauth2service, и делаю curl для кода, если он не существует
$url = 'https://accounts.google.com/o/oauth2/v2/auth?';
$url .= 'client_id=' . Config::$googleClientId;
$url .= '&redirect_uri=' . urlencode(Config::$googleRedirectUrl);
$url .= '&scope=' . urlencode("https://www.googleapis.com/auth/youtube");
$url .= '&response_type=code';
Он возвращает меня на страницу перенаправления, когда я получаю код, сохраняю его в приложении для дальнейшего использования. Пользователь записывает информацию о видео и нажимает кнопку «Далее». Я создаю новую ветку для загрузки сервиса, использую сгенерированный код для получения токена доступа, который используется для загрузки формы
$curl = curl_init('https://accounts.google.com/o/oauth2/token');
$post_fields = array(
'code' => $code,
'client_id' => Config::$googleClientId,
'client_secret' => Config::$googleSecretCode,
'redirect_uri' => Config::$googleRedirectUrl,
'grant_type' => 'authorization_code'
);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post_fields));
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded'
));
//send request
$response = curl_exec($curl);
curl_close($curl);
$json = json_decode($response,true);
$this->authValue = $json["access_token"];
// The method returns response xml
$response = false;
$youtubeVideoKeywords = ""; // This is the uploading video keywords.
$youtubeVideoCategory = $this->getVideoCategory(); // This is the uploading video category. There are only certain categories that are accepted. See below the method
$data = '<?xml version="1.0"?'.'>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007">
<media:group>
<media:title type="plain">'.stripslashes($youtubeVideoTitle).'</media:title>
<media:description type="plain">'.stripslashes($youtubeVideDescription).'</media:description>
<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">'.$youtubeVideoCategory.'</media:category>
<media:keywords>'.$youtubeVideoKeywords.'</media:keywords>
</media:group>
<yt:accessControl action="list" permission="denied"/>
</entry>';
$headers = array(
'Authorization: Bearer ' . $this->authValue,
'GData-Version: 2',
'X-GData-Key: key=' . Config::$youtubeDevKey,
'Content-Type: application/atom+xml; charset=UTF-8'
);
$curl = curl_init("http://gdata.youtube.com/action/GetUploadToken");
curl_setopt($curl,CURLOPT_USERAGENT,$_SERVER["HTTP_USER_AGENT"]);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_TIMEOUT,10);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headers);
curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
curl_setopt($curl,CURLOPT_REFERER,true);
curl_setopt($curl,CURLOPT_HEADER,0);
$response = simplexml_load_string(curl_exec($curl));
curl_close($curl);
return $response;
Все хорошо, теперь у меня есть форма, где действие на сервер YouTube с токеном. все работает.
Но теперь нужно согласие пользователя на использование веб-приложения, почему? У меня есть мой аккаунт YouTube, где хранятся видео, нет необходимости в информации о пользователе аккаунта Google. Это очень раздражает, потому что пользователь должен войти в приложение, после входа он говорит вам, что необходимо войти в учетную запись Google …
Есть ли какое-либо решение / решение, которое может сделать загрузку видео на мой канал YouTube такой же простой, как и раньше, без oauth2, пожалуйста?
Вам необходимо настроить учетную запись службы, что означает назначение общедоменных делегаций: https://console.developers.google.com/apis/credentials
«Для поддержки межсерверных взаимодействий сначала создайте служебную учетную запись для своего проекта в консоли API. Если вы хотите получить доступ к пользовательским данным для пользователей в вашем домене G Suite, то делегируйте общедоменный доступ к учетной записи службы.
Затем ваше приложение готовится сделать авторизованные вызовы API с использованием учетных данных учетной записи службы для запроса токена доступа с сервера аутентификации OAuth 2.0.
Наконец, ваше приложение может использовать токен доступа для вызова API Google «.
Помогите: https://developers.google.com/identity/protocols/OAuth2ServiceAccount
Без учетной записи службы пользователю всегда требуется согласие на экран согласия, тогда как учетная запись службы обходит экран согласия, что делает его применимым для таких операций, когда вы хотите, чтобы он работал в фоновом режиме. Это не очень хорошо отражено в их документации (или мне еще не удалось найти хороший ресурс … хотя я чувствую, что перевернул каждый камень на этой планете).
У меня возникли проблемы с получением токенов, но у меня уже работали сервисные сценарии … возможно, мы можем помочь друг другу? http://fb.com/jmt193 🙂
Я отвечу на вопросы, если вы их зададите.
Других решений пока нет …