Кто-нибудь здесь знает о том, как получить доступ к API Google Фото теперь, когда Google начал использовать OAuth2? Клиентская библиотека PHP на их веб-сайте для разработчиков устарела и не работает!
Я использовал OAuth для работы с Google Диском, но Фото не работает! 🙁
Сначала я использую Google_Client
успешно аутентифицировать пользователя. Затем на странице перенаправления я пытаюсь следующее:
require_once("Google/Client.php");
//set up path for Zend GData, because Google Documentation uses that lib
$clientLibraryPath = '/path/to/ZendGData/library';
$oldPath = set_include_path(get_include_path() . PATH_SEPARATOR . $clientLibraryPath);
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Photos');
try
{
$authCode = $_GET['code']; //authorization code returned from google
//next create google OAuth Client object and validate...
$webAuth= new Google_Client();
$webAuth->setClientId($clientId);
$webAuth->setClientSecret($clientSecret);
$webAuth->authenticate($authCode); //this authenticate() works fine...
//now my problem is HOW do I tie this to GData API for Picasa :(
//I tried following but it throws error
//*Token invalid - Invalid token: Request token used when not allowed.*
$client = Zend_Gdata_AuthSub::getHttpClient($authCode);
$gp = new Zend_Gdata_Photos($client, "GData:2.0");
$userFeed = $gp->getUserFeed("default");
Я также попробовал кучу сторонних библиотек, попытался подключить мой $webAuth
в Zend_GData_Photos
любым способом, которым я могу попробовать … Я даже попробовал грубые вызовы curl, но ничего не работает!
Кто-нибудь может мне помочь? Я в своем уме … Я не могу поверить, что Google оставил полнофункциональную библиотеку (PicasaWeb PHP API Ver 1.0), которая так зависла, когда они обновили свою аутентификацию до OAuth.
У меня была та же проблема, но наконец я снова заработал.
Лучше всего то, что вам не нужна никакая клиентская библиотека для доступа к личным фотографиям.
Я потратил два дня, пытаясь заставить его работать с «служебной учетной записью», но безуспешно.
Тогда я нашел эту страницу:
https://holtstrom.com/michael/blog/post/522/Google-OAuth2-with-PicasaWeb.html
что помогло мне добиться того, чего я хотел.
Это довольно длинная статья, но она не займет много времени, чтобы разобраться и заставить ее работать. В основном вам нужно будет использовать «Идентификатор клиента OAuth 2.0» вместо «Сервисная учетная запись» в вашем проекте на https://console.developers.google.com
В вашем идентификаторе клиента OAuth 2.0 вы будете иметь следующую информацию:
Вы будете использовать эти данные в процессе проверки.
Прежде чем начать, вам необходимо заполнить экран OAuth Consent.
В этом руководстве есть примечание для хранения этих токенов в БД, но в этом случае я бы предпочел отобразить их непосредственно на веб-странице. Это намного проще.
Есть предложение использовать https, а не http, но он должен работать на обоих.
Я использовал https для моего приложения.
Это более короткая версия статьи по ссылке выше.
Создайте oauth2.phр файл и поместите его на https://www.yoursite.com/oauth2.php
<?php
if (isset($_GET['code']))
{
$clientId = 'your-client-id.apps.googleusercontent.com';
$clientSecret = 'your-client-secret';
$referer = 'https://www.yoursite.com/oauth2.php';
$postBody = 'code='.urlencode($_GET['code'])
.'&grant_type=authorization_code'
.'&redirect_uri='.urlencode($referer)
.'&client_id='.urlencode($clientId)
.'&client_secret='.urlencode($clientSecret);
$curl = curl_init();
curl_setopt_array( $curl,
array( CURLOPT_CUSTOMREQUEST => 'POST'
, CURLOPT_URL => 'https://accounts.google.com/o/oauth2/token'
, CURLOPT_HTTPHEADER => array( 'Content-Type: application/x-www-form-urlencoded'
, 'Content-Length: '.strlen($postBody)
, 'User-Agent: www.yoursite.com/0.1 +https://www.yoursite.com/'
)
, CURLOPT_POSTFIELDS => $postBody
, CURLOPT_REFERER => $referer
, CURLOPT_RETURNTRANSFER => 1 // means output will be a return value from curl_exec() instead of simply echoed
, CURLOPT_TIMEOUT => 15 // max seconds to wait
, CURLOPT_FOLLOWLOCATION => 0 // don't follow any Location headers, use only the CURLOPT_URL, this is for security
, CURLOPT_FAILONERROR => 0 // do not fail verbosely fi the http_code is an error, this is for security
, CURLOPT_SSL_VERIFYPEER => 1 // do verify the SSL of CURLOPT_URL, this is for security
, CURLOPT_VERBOSE => 0 // don't output verbosely to stderr, this is for security
) );
$response = curl_exec($curl);
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
echo($response);
echo($http_code);
}
else { echo 'Code was not provided.'; }
?>
Подготовьте и перейдите по этой ссылке:
https://accounts.google.com/o/oauth2/auth?scope=https://picasaweb.google.com/data/&response_type = код&access_type = отсутствует&redirect_uri = https: //www.yoursite.com/oauth2.php&approval_prompt = сила&client_id = your-client-id.googleusercontent.com
поля для настройки: redirect_uri и client_id
https://www.yoursite.com/oauth2.php?code=some-random-code
который возвратит (напечатает) данные в формате json, содержащие: access_token, token_type, expires_in и refresh_token.
Http код ответа должен быть 200.
Access_token будет использоваться для получения данных альбомов.
Создайте index.php с содержанием:
<?php
$curl = curl_init();
$url = 'https://picasaweb.google.com/data/entry/api/user/default';
curl_setopt_array( $curl,
array( CURLOPT_CUSTOMREQUEST => 'GET'
, CURLOPT_URL => $url
, CURLOPT_HTTPHEADER => array( 'GData-Version: 2'
, 'Authorization: Bearer '.'your-access-token' )
, CURLOPT_RETURNTRANSFER => 1 // means output will be a return value from curl_exec() instead of simply echoed
) );
$response = curl_exec($curl);
$http_code = curl_getinfo($curl,CURLINFO_HTTP_CODE);
curl_close($curl);
echo($response . '<br/>');
echo($http_code);
?>
После запуска скрипта из шага 5. вы должны получить ваш фид по умолчанию из API picasaweb. Когда я говорю «по умолчанию», оно означает «по умолчанию», когда вы вошли в систему с личными альбомами. Теперь вы сможете использовать этот подход, чтобы получить доступ к своей библиотеке фотографий Picasa.
Срок действия токена истекает через 3600 секунд (1 час), поэтому вам придется получить новый. это может быть достигнуто с помощью скрипта, как этот ниже:
$clientId = 'your-client-id.apps.googleusercontent.com';
$clientSecret = 'your-client-secret';
$referer = 'https://www.yoursite.com/oauth2.php';
$refreshToken = 'your-refresh-token';
$postBody = 'client_id='.urlencode($clientId)
.'&client_secret='.urlencode($clientSecret)
.'&refresh_token='.urlencode($refreshToken)
.'&grant_type=refresh_token';
$curl = curl_init();
curl_setopt_array( $curl,
array( CURLOPT_CUSTOMREQUEST => 'POST'
, CURLOPT_URL => 'https://www.googleapis.com/oauth2/v3/token'
, CURLOPT_HTTPHEADER => array( 'Content-Type: application/x-www-form-urlencoded'
, 'Content-Length: '.strlen($postBody)
, 'User-Agent: www.yoursite.com/0.1 +https://www.yoursite.com/'
)
, CURLOPT_POSTFIELDS => $postBody
, CURLOPT_RETURNTRANSFER => 1 // means output will be a return value from curl_exec() instead of simply echoed
, CURLOPT_TIMEOUT => 15 // max seconds to wait
, CURLOPT_FOLLOWLOCATION => 0 // don't follow any Location headers, use only the CURLOPT_URL, this is for security
, CURLOPT_FAILONERROR => 0 // do not fail verbosely fi the http_code is an error, this is for security
, CURLOPT_SSL_VERIFYPEER => 1 // do verify the SSL of CURLOPT_URL, this is for security
, CURLOPT_VERBOSE => 0 // don't output verbosely to stderr, this is for security
) );
$response = curl_exec($curl);
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if (strlen($response) < 1)
{ echo('fail 01'); }
$NOW = time();
$responseDecoded = json_decode($response, true); // convert returned objects into associative arrays
$expires = $NOW - 60 + intval($responseDecoded['expires_in']);
if ( empty($responseDecoded['access_token'])
|| $expires <= $NOW )
{ echo('fail 02'); }
echo($http_code . '<br/>');
echo($response . '<br/>');
echo($expires . '<br/>');
?>
Вы можете запустить код из шага 7. в отдельном сценарии вручную, просто чтобы получить новый токен доступа еще на 3600 секунд, но обычно вы хотите, чтобы он был автоматизирован, поэтому по истечении срока действия access_token вы автоматически запрашиваете новый, используя вызов с refresh_token с шага 4.
Ufff. Это так. Я надеюсь, что вы это запустите.
Других решений пока нет …