web-dev-qa-db-fra.com

Google API: 404 Domaine non trouvé

Je commence à travailler avec Google API, mais j’ai un projet qui nécessite que j’accède à leur domaine pour trouver le responsable d’un utilisateur par courrier électronique. Avant de commencer le code, je voulais tout configurer. J'ai donc suivi le fichier example pour PHP. Je pouvais le faire fonctionner, mais il y avait quelques problèmes avec l'actualisation du jeton après son expiration et la recherche m'a poussé à utiliser un Compte de service , car il s'agit d'un script cron de serveur et je ne veux pas m'en occuper. avec toutes les interactions utilisateur.

J'ai créé le compte de service, activé la délégation de domaine G Suite et ajouté l'accès pour: https://www.googleapis.com/auth/admin.directory.user.readonly

Je reçois un Google_Service_Exception avec mon script. 

La réponse est:

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

Je suppose que cela signifie qu'il ne connaît pas le domaine des comptes, mais je ne vois pas comment résoudre ce problème. Je suppose que s'il s'agissait d'un problème d'autorisations, Google me le signalerait. J'ai essayé de chercher en ligne, mais sans succès, car les problèmes rencontrés utilisaient une méthode différente et que les correctifs ne pouvaient pas être résolus avec le compte de service. Je suis coincé pour le moment, alors j'espère qu'une poussée dans la bonne direction me permettra de me mettre sur la bonne voie.

Voici le script de test que j'utilise:

<?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());
    }
}

Mon service_account.json contient (nettoyé évidemment)

{
    "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"
}

Merci pour toute aide à ce sujet.

14
Jeremy

D'accord, c'était une étape très facile à négliger, mais c'était une solution extrêmement simple.

Le problème ici était que le domaine du compte n'a pas été identifié. J'avais l'impression que le compte de service était déjà associé au domaine, mais ce n'est pas le cas. Donc, le correctif est juste une ligne de code à ajouter au client pour le définir à un utilisateur qui est dans le domaine (dans mon cas).

La solution pour moi était d'ajouter:

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

à ma méthode getClient.

alors maintenant, la méthode ressemble à:

/**
 * 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;
}

J'ai vu cela mentionné dans l'API mais il est indiqué comme facultatif. J'espère que cela aidera quelqu'un d'autre aussi.

10
Jeremy

pour moi était la même erreur, mais je devais partager mon calendrier avec la messagerie du compte de service (celle trouvée dans le fichier json auth). Après cela, l'erreur disparut.

1
Tomas Šivickas