web-dev-qa-db-fra.com

L'API Gmail renvoie le code d'erreur 403 et "Délégation refusée pour <e-mail utilisateur>"

L'API Gmail échoue pour un domaine lors de la récupération des messages avec cette erreur:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 OK
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Delegation denied for <user email>",
    "reason" : "forbidden"
  } ],
  "message" : "Delegation denied for <user email>"
}

J'utilise OAuth 2.0 et délégation d'autorité à l'échelle du domaine Google Apps pour accéder aux données utilisateur. Le domaine a accordé des droits d'accès aux données à l'application.

24
user1333358

Il semble que la meilleure chose à faire est de toujours avoir userId = "me" dans vos demandes. Cela indique à l'API d'utiliser uniquement la boîte aux lettres de l'utilisateur authentifié - pas besoin de s'appuyer sur des adresses e-mail.

44
Eric D

Nos utilisateurs ont migré vers un domaine et leur compte est associé à des alias. Nous devions définir l'adresse SendAs par défaut sur l'un des alias importés et nous voulions un moyen de l'automatiser. L'API Gmail ressemblait à la solution, mais notre utilisateur privilégié avec des rôles pour apporter des modifications aux comptes ne fonctionnait pas - nous voyions toujours l'erreur "Délégation refusée pour" 403.

Voici un PHP exemple de la façon dont nous avons pu lister leurs paramètres SendAs.

<?PHP

//
// Description:
//   List the user's SendAs addresses.
//
// Documentation:
//   https://developers.google.com/gmail/api/v1/reference/users/settings/sendAs
//   https://developers.google.com/gmail/api/v1/reference/users/settings/sendAs/list
//
// Local Path:
//   /path/to/api/vendor/google/apiclient-services/src/Google/Service/Gmail.php
//   /path/to/api/vendor/google/apiclient-services/src/Google/Service/Gmail/Resource/UsersSettingsSendAs.php
//
// Version:
//    Google_Client::LIBVER  == 2.1.1
//

require_once $API_PATH . '/path/to/google-api-php-client/vendor/autoload.php';

date_default_timezone_set('America/Los_Angeles');

// this is the service account json file used to make api calls within our domain
$serviceAccount = '/path/to/service-account-with-domain-wide-delagation.json';
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $serviceAccount );

$userKey = '[email protected]';

// In the Admin Directory API, we may do things like create accounts with 
// an account having roles to make changes. With the Gmail API, we cannot 
// use those accounts to make changes. Instead, we impersonate
// the user to manage their account.

$impersonateUser = $userKey;

// these are the scope(s) used.
define('SCOPES', implode(' ', array( Google_Service_Gmail::GMAIL_SETTINGS_BASIC ) ) );

$client = new Google_Client();
$client->useApplicationDefaultCredentials();  // loads whats in that json service account file.
$client->setScopes(SCOPES); // adds the scopes
$client->setSubject($impersonateUser);  // account authorized to perform operation

$gmailObj  = new Google_Service_Gmail($client);

$res       = $gmailObj->users_settings_sendAs->listUsersSettingsSendAs($userKey);

print_r($res);


?>
1
Jay Fowler

Je voulais accéder aux e-mails du nouvel identifiant/compte de messagerie, mais ce qui s'est passé, c'est que le dossier récemment créé avec '.credentials' contenant un JSON a été associé au précédent identifiant/compte de messagerie que j'ai essayé plus tôt. Le jeton d'accès et les autres paramètres présents dans JSON ne sont pas associés à un nouvel identifiant/compte de messagerie. Donc, pour le faire fonctionner, il vous suffit de supprimer le dossier ".credentails" et de réexécuter le programme. Maintenant, le programme ouvre le navigateur et vous demande de donner des autorisations.

Pour supprimer le dossier contenant des fichiers en python

import shutil
shutil.rmtree("path of the folder to be deleted")

vous pouvez l'ajouter à la fin du programme

1
Sai Kiran