2014-09-29 2 views
4

Я пытаюсь использовать google-api-client в PHP для проекта. я получил «доступ запрещен» ответ в то время как в этом заявлении:refreshTokenWithAssertion Permission Denied

$client->getAuth()->refreshTokenWithAssertion(); 

Google_IO_Exception, сообщение: Не удалось подключиться к 74.125.193.84: Отказано в Файл: /home/www/blah.com/restful /libs/Google/IO/Curl.php Строка: 81 /home/www/blah.com/restful/libs/Google/IO/Abstract.php(125): Google_IO_Curl-> executeRequest (объект (Google_Http_Request))

# 1 /home/www/blah.com/restful/libs/Google/Auth/OAuth2.php(326): Google_IO_Abstract-> makeRequest (объект (Google_Http_Request))

# 2 /home/www/blah.com/restful/libs/Google/Auth/OAuth2.php(306): Google_Auth_OAuth2-> refreshTokenRequest (Array)

# 3/дома/WWW/л. ком/успокоительное/v2/index.php (122): Google_Auth_OAuth2-> refreshTokenWithAssertion()

Я проверил все мои документы, и они выглядят правильно, что может быть проблема?

Спасибо, Джон

код:

$client_id = '1234blahblahblah.apps.googleusercontent.com'; //Client ID 
$service_account_name = '[email protected]'; //Email Address 
$key_file_location = 'blahblah-1234.p12'; //key.p12 

$client = new Google_Client(); 
$client->setApplicationName("test"); 
$service = new Google_Service_Calendar($client); 
if (isset($_SESSION['service_token'])) { 
    $client->setAccessToken($_SESSION['service_token']); 
} 
$key = file_get_contents($key_file_location); 

$cred = new Google_Auth_AssertionCredentials(
    $service_account_name, 
    array('https://www.googleapis.com/auth/calendar'), 
    $key 
    ); 

print_r($cred); 

$client->setAssertionCredentials($cred); 

$client->setClientId($client_id); 

if($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion(); //<<<<<failed here. 
} 
$_SESSION['service_token'] = $client->getAccessToken(); 
echo $_SESSION['service_token']; 
} 
+0

этот код находится в другом файле .php. Я использовал chrom's restful client для тестирования .php, который, в свою очередь, вызывает google api, как указано выше, является ли это правильным способом его протестировать? – john

+0

Он должен быть синхронизирован с NTP. Прочитайте комментарии http://stackoverflow.com/questions/25376791/fatal-error-uncaught-exception-google-auth-exception-with-message-error-refr#comment39574276_25376949 –

+0

Метод Google_Client # loadServiceAccountJson ($ jsonLocation, $ области) можно использовать для создания объекта Google_Auth_AssertionCredentials. Этот метод не упоминается в текущей документации.Он может напрямую обрабатывать JSON-файл со всеми необходимыми данными, такими как закрытый ключ. [Документация по API для проверки подлинности] (https://developers.google.com/api-client-library/php/auth/service-accounts) –

ответ

-3

См service-account.php образца в examples/ каталоге библиотеки Google Клиентского API для PHP на github.com:

if($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion($cred); // set credentials there 
} 
+0

это не добавляет значения – John

1

Hi Джон. У меня такая же проблема, и, наконец, это работает для меня:

До линии:

if($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion(); //<<<<<failed here. 
} 

Я положил попытке поймать и возвращает мне, что у меня проблемы с правами доступа writtin:

try { 
    $client->getAuth()->refreshTokenWithAssertion($cred); 
} catch (Exception $e) { 
    var_dump($e->getMessage()); 
} 

Я мог бы сделать 2 вещи:

1) Go в Google/src/Config.php и изменить строку 94: 'directory' => sys_get_temp_dir(). '/ Google_Client'and изменить каталог для сохранения файлов временного архива

2) или как я сделал echo sys_get_temp_dir(); перед попыткой поймать и предоставить разрешение chmod 777 этому директору

Это решение работает для меня, надеюсь, и для вас. Во всяком случае, попытка/улов, ожидающая сообщения об исключении

+0

благодаря Альберто. но я пробовал этот метод, но он не работал. из трассировки ошибка возникает при curl.php: $ response = curl_exec ($ curl); if ($ response === false) { throw new Google_IO_Exception (curl_error ($ curl)); } – john

+0

поэтому curl.php отправляет запрос на отправку на сервер google api и получает ответ «разрешенное разрешение», похоже, что учетные данные неверны, но я проверял, они в порядке ... – john

+0

btw, echo sys_get_temp_dir() показывает '\ tmp', но у меня нет этой папки на сервере. поэтому я создал один вместо этого – john