google-api-php-client: Неверный клиентский секретный файл JSON

Похоже, что последняя версия google-api-php-client для PHP не соответствует документам @ https://developers.google.com/drive/web/examples/php

Глядя на код src, я вижу, что он ищет ключи в загруженном JSON, который метод setAuthConfigFile () не может найти: client_secret, установленный, web, redirect_uris (другие?) Не присутствуют в загруженном JSON. Доступны только private_key_id, private_key, client_email, client_id и тип.

Код и документы выглядят действительно дезорганизованными и не синхронизированными … не были бы первыми для Google. Кто-нибудь получил работу OAuth, которая недавно использовала эту библиотеку?

Существует различие между «учетной записью службы» и «веб-апликацией» для совершения вызовов в API. Когда вы client_email «учетную запись службы», вы получите файл, описанный выше, файл JSON с client_email , client_id , client_id и т. Д.

При создании веб-приложения вам будут предоставлены client_id , client_secret , redirect_uri и т. Д.

Я бы предложил прочитать эти страницы, чтобы выбрать, какой ключ и логин вам нужен (на обеих страницах вы найдете примеры, чтобы интегрировать его в PHP):

Вы можете использовать клиентскую библиотеку API Google для PHP для создания приложений веб-сервера, использующих авторизацию OAuth 2.0 для доступа к API Google. OAuth 2.0 позволяет пользователям обмениваться конкретными данными с приложением, сохраняя свои имена пользователей, пароли и другую информацию конфиденциальной. Например, веб-приложение может использовать OAuth 2.0 для получения разрешения от пользователей хранить файлы в своих Google Дисках.

https://developers.google.com/api-client-library/php/auth/web-app

Как правило, приложение использует учетную запись службы, когда приложение использует API Google для работы со своими данными, а не с данными пользователя. Например, приложение, использующее Google Cloud Datastore для сохранения данных, будет использовать учетную запись службы для аутентификации своих вызовов в API облачного хранилища данных Google.

https://developers.google.com/api-client-library/php/auth/service-accounts

В php-библиотеке есть новая функция, которая приближается к ней, но не позволяет устанавливать sub, поэтому всегда дает отказ авторизации. Итак, сначала обновите библиотечную функцию php loadServiceAccountJson в src / Google / Client.php:

  public function loadServiceAccountJson($jsonLocation, $scopes) { $data = json_decode(file_get_contents($jsonLocation)); if (isset($data->type) && $data->type == 'service_account') { // Service Account format. $cred = new Google_Auth_AssertionCredentials( $data->client_email, $scopes, $data->private_key, 'notasecret', 'http://oauth.net/grant_type/jwt/1.0/bearer', $data->sub ); return $cred; } else { throw new Google_Exception("Invalid service account JSON file."); } } 

Затем добавьте значение sub к данным в файле auth json сервера:

 { "private_key_id": "removed", "private_key": "-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----\n", "client_email": "removed", "client_id": "removed", "redirect_uris":[your urls here], "type": "service_account", "sub": "valid.user@google.domain.com" } 

Теперь получите разрешение:

 $credentials = $client->loadServiceAccountJson('serverauth.json',"https://www.googleapis.com/auth/admin.directory.user.readonly"); $client->setAssertionCredentials($credentials); if ($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion(); } 

Где serverauth.json – ключевой файл JSON, загруженный из учетной записи службы, которую вы хотите использовать, и добавляет подстроку.

И, наконец, создайте экземпляр каталога и запросите его:

 $service = new Google_Service_Directory($client); $optParams = array( 'domain' => 'google.domain.com', 'orderBy' => 'email', 'viewType' => 'domain_public', 'query' => "givenName:'Joe' familyName:'Schmoe Jr'" ); $results = $service->users->listUsers($optParams); $users = $results->getUsers(); print_r($users); 

Я понимаю ваш риск. У вас проблемы с Google API. В консоли Google API есть 3 вида json-файла, один – Web, второй – Service, а последний – Installed. выбор, который вам нужно использовать, – это установка, потому что вы получите ключ, установленный или другой.

1) «CREDENTIALS_PATH» должен указывать на несуществующий файл (в пути для записи)

2) «CLIENT_SECRET_PATH» должен указывать на файл учетных данных «ID клиента OAuth 2.0», созданный и загруженный из консоли Google в разделе «Учетные данные Api».

Для скрипта php на стороне сервера, как и ваш, обратите внимание при создании записи «ID клиента OAuth 2.0»: в мастере создания вы должны выбрать «другой» тип приложения, а не «веб-тип».

С уважением