2016-12-21 5 views
1

У меня есть приложение, которое может загружать видео в мою учетную запись YouTube, но после перехода на YouTube API v3 ситуация сложная.php Browser-based Uploading video to youtube channel apiv3

он использовал эту реализацию 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; 

Я не нужно никакого разрешения на загрузку видео, пользователь использовал только форма, где набирается название, desc и т. д., загружается видео с компьютера и загружается. Все было в порядке, пользователи могли загружать видео на мой канал YouTube. пользователи довольны, потому что не было дополнительного входа.

Но теперь, когда я делаю запрос curl к https://www.google.com/youtube/accounts/ClientLogin, он говорит, что мне нужно oauth2.0 auth service.

Итак, я сгенерировал тайны oauth2 для моей службы, внес изменения в код, но когда пользователь хочет использовать это приложение, он должен быть зарегистрирован в учетной записи google и разрешить разрешения использовать веб-приложение.

Новый фрагмент кода:

Когда пользователь хочет, чтобы загрузить видео, я проверить Идент код из oauth2service, и сделать завиток для кода, если оленья кожа существовать

$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, пожалуйста?

ответ

0

Вам нужно настроить с помощью учетной записи службы, которая означает, присваивающую весь домен делегацию: https://console.developers.google.com/apis/credentials

«Для того, чтобы поддерживать сервер-сервер взаимодействия, необходимо сначала создать учетную запись службы для вашего проекта в API консоли Если. вы хотите получить доступ к пользовательским данным для пользователей в своем домене G Suite, а затем делегировать доступ к учетной записи службы домена. Затем ваше приложение готовится сделать авторизированные вызовы API, используя учетные данные учетной записи службы, чтобы запросить токен доступа из OAuth 2.0 auth server Наконец, ваше приложение может использовать токен доступа для вызова API Google."

Помощь: https://developers.google.com/identity/protocols/OAuth2ServiceAccount

Без учетной записи службы всегда будет требовать человеческого пользователя, чтобы принять экран согласия, в то время как учетная запись службы обходит экран согласия, что делает его применимым для таких операций, в которых вы хотите за это (или я еще не нашел хороший ресурс ... хотя я чувствую, что я превратил каждый камень на этой планете).

У меня возникли проблемы получение токенов для работы, но у нас уже есть служебные скрипты ... возможно, мы можем помочь друг другу? http://fb.com/jmt193 :)

Я отвечу на вопросы, если вы спросите их.

 Смежные вопросы

  • Нет связанных вопросов^_^