Google API: 404 домен не найден

Я новичок в работе с Google API, но у меня есть проект, который требует от меня доступа к их домену, чтобы найти менеджера пользователя по электронной почте. Прежде чем я начал писать код, я хотел настроить все, чтобы я следил за примером файла для PHP. Я смог заставить его работать, но имел некоторые проблемы с обновлением токена, когда он истек, и исследования подтолкнули меня к использованию учетной записи службы, поскольку это сервер cron script и я не хочу иметь дело с любыми взаимодействиями с пользователем.

Я создал учетную запись службы, включил делегирование домена G Suite и добавил доступ для: https://www.googleapis.com/auth/admin.directory.user.readonly

Я получаю Google_Service_Exception с моим script.

Ответ:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "notFound",
    "message": "Domain not found."
   }
  ],
  "code": 404,
  "message": "Domain not found."
 }
}

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

Это тест script Я использую:

<?php

require_once( __DIR__. '/vendor/autoload.php' );

define('CREDENTIALS_PATH', '/path/to/service_account.json');

define('SCOPES', implode(' ', array(
        Google_Service_Directory::ADMIN_DIRECTORY_USER_READONLY)
));

date_default_timezone_set('America/New_York');

/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient() {
    $client = new Google_Client();
    $client->setApplicationName('TestingApp');
    $client->setAuthConfig(CREDENTIALS_PATH);
    $client->setScopes(SCOPES);

    return $client;
}   

// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Directory($client);

// Print the first 10 users in the domain.
$optParams = array(
    'customer' => 'my_customer',
    'maxResults' => 10,
    'orderBy' => 'email',
);
$results = $service->users->listUsers($optParams);

if (count($results->getUsers()) == 0) {
    print "No users found.\n";
} else {
    print "Users:\n";
    foreach ($results->getUsers() as $user) {
        printf("%s (%s)\n", $user->getPrimaryEmail(),
            $user->getName()->getFullName());
    }
}

Мой service_account.json содержит (очищается, очевидно)

{
    "type": "service_account",
    "project_id": "PROJECT_ID",
    "private_key_id": "PRIVATE_KEY_ID",
    "private_key": "PRIVATE_KEY",
    "client_email": "SERVICE_ACCOUNT_EMAIL.iam.gserviceaccount.com",
    "client_id": "CLIENT_ID",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_IDENTIFIER.iam.gserviceaccount.com"
}

Спасибо за любую помощь по этому поводу.

Ответ 1

Хорошо, это был очень простой шаг, чтобы пропустить, но это было очень простое решение.

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

Исправление для меня заключалось в том, чтобы добавить:

$client->setSubject('[email protected]');

к моему методу getClient.

теперь метод выглядит следующим образом:

/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient() {
    $client = new Google_Client();
    $client->setApplicationName('TestingApp');
    $client->setAuthConfig(CREDENTIALS_PATH);
    $client->setScopes(SCOPES);
    $client->setSubject('[email protected]');
    return $client;
}

Я видел упомянутый в API, но он указывает его как необязательный. Надеюсь, это тоже поможет кому-то еще.

Ответ 2

для меня была та же ошибка, но мне нужно было разделить мой календарь с электронной почтой службы (которая найдена в json файле auth). После этого ошибка исчезла.