(400) Неверный запрос с использованием PHP-клиента Google API с Admin SDK

Я пытаюсь использовать PHP-клиент API Google с API каталога Google. Я зашел в Google Developers Console и создал проект под названием google-sync. Затем я включил Admin SDK на странице списка API. Затем я выбрал «Создать новый идентификатор клиента» на странице «Учетные данные» и выбрал Service Account, а затем загрузил закрытый ключ .bin, который мне было предложено загрузить. Затем я также нажал «Создать новый ключ P12» и загрузил файл .p12, который был помещен в тот же каталог, что и файл PHP.

Вот мой код PHP (который следует за этой частью документации) который пытается перечислить всех пользователей.

<?php
session_start();
require 'vendor/autoload.php';
$SCOPE = 'https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.group https://www.googleapis.com/auth/admin.directory.orgunit';

$SERVICE_ACCOUNT_EMAIL = '<EMAIL ADDRESS>';
$SERVICE_ACCOUNT_PKCS12_FILE_PATH = '<P12 FILE NAME>.p12';

$client = new Google_Client();
$client->setApplicationName('google-sync');
$adminService = new Google_Service_Directory($client);
$key = file_get_contents($SERVICE_ACCOUNT_PKCS12_FILE_PATH);
$cred = new Google_Auth_AssertionCredentials(
    $SERVICE_ACCOUNT_EMAIL,
    array($SCOPE),
    $key);
$client->setAssertionCredentials($cred);

$allUsers = $adminService->users->listUsers();

Когда я запускаю этот код, я получаю эту ошибку:

PHP Fatal error:  Uncaught exception 'Google_Service_Exception' with message 'Error calling GET https://www.googleapis.com/admin/directory/v1/users: (400) Bad Request' in /projects/google-sync/vendor/google/apiclient/src/Google/Http/REST.php:80
Stack trace:

#0 /projects/google-sync/vendor/google/apiclient/src/Google/Http/REST.php(44): Google_Http_REST::decodeHttpResponse(Object(Google_Http_Request))
#1 /projects/google-sync/vendor/google/apiclient/src/Google/Client.php(499): Google_Http_REST::execute(Object(Google_Client), Object(Google_Http_Request))
#2 /projects/google-sync/vendor/google/apiclient/src/Google/Service/Resource.php(195): Google_Client->execute(Object(Google_Http_Request))
#3 /projects/google-sync/vendor/google/apiclient/src/Google/Service/Directory.php(2063): Google_Service_Resource->call('list', Array, 'Google_Service_...')
#4 /projects/google-sync/auth-test.php(20): Google_Service_Directory_Users_Resource->listUsers()
#5 {main}
  thrown in /projects/google-sync/vendor/google/apiclient/src/Google/Http/REST.php on line 80

Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling GET https://www.googleapis.com/admin/directory/v1/users: (400) Bad Request' in /projects/google-sync/vendor/google/apiclient/src/Google/Http/REST.php on line 80

Google_Service_Exception: Error calling GET https://www.googleapis.com/admin/directory/v1/users: (400) Bad Request in /projects/google-sync/vendor/google/apiclient/src/Google/Http/REST.php on line 80

Call Stack:
    0.0001     232296   1. {main}() auth-test.php:0
    0.0172    2957992   2. Google_Service_Directory_Users_Resource->listUsers() /projects/google-sync/auth-test.php:20
    0.0172    2959144   3. Google_Service_Resource->call() /projects/google-sync/vendor/google/apiclient/src/Google/Service/Directory.php:2063
    0.3356    2970752   4. Google_Client->execute() /projects/google-sync/vendor/google/apiclient/src/Google/Service/Resource.php:195
    0.3356    2971568   5. Google_Http_REST::execute() /projects/google-sync/vendor/google/apiclient/src/Google/Client.php:499
    0.7015    2974424   6. Google_Http_REST::decodeHttpResponse() /projects/google-sync/vendor/google/apiclient/src/Google/Http/REST.php:44

Когда я загрузил файл p12, мне был предоставлен пароль, связанный с закрытым ключом, но я не могу найти никакой документации о том, как этот пароль должен быть включен. Это моя проблема?


person Nathan Jones    schedule 27.08.2014    source источник


Ответы (2)


Я столкнулся с той же проблемой. Учетная запись службы должна выдавать себя за администратора домена при выполнении запроса. Кроме того, listUsers() ожидает, что домен будет передан в качестве аргумента.

Убедитесь, что вы делегировали сервисному аккаунту полномочия на уровне домена — https://developers.google.com/api-client-library/php/auth/service-accounts

$cred = new Google_Auth_AssertionCredentials(
    $service_account_name,
    array($SCOPE),
    $key
);
$cred->sub = "[email protected]";
//Get All users.
$list  = $service->users->listUsers(Array('domain' => 'domain.com'));
//Get one user
$userId = $service->users->get('[email protected]');
person Sibil    schedule 19.04.2015

Я смог исправить это, войдя в консоль администратора моего домена, перейдя на страницу управления доступом клиента API в разделе «Безопасность», добавив идентификатор клиента из консоли разработчика и добавив области, необходимые для API каталога.

Дополнительные сведения см. в этой части документации. .

person Nathan Jones    schedule 27.08.2014
comment
я хочу получить доступ к информации о группах google (из рабочей области), моя цель - добавить участника с помощью некоторого приложения в группы google, я настроил эту область (https://www.googleapis.com/auth/admin.directory.group.member,https://www.googleapis.com/auth/admin.directory.group.member.readonly,https://www.googleapis.com/auth/admin.directory.group,https://www.googleapis.com/auth/admin.directory.group.readonly ) Теперь я получаю 400 ошибка неверного запроса в моем приложении после developers.google.com/admin- sdk/directory/v1/quickstart/php это. вы не могли бы мне помочь. - person Manish Agarwal; 13.07.2021