web-dev-qa-db-ja.com

Gmail APIは403エラーコードと「<user email>の委任が拒否されました」を返します

次のエラーでメッセージを取得すると、1つのドメインでGmail APIが失敗します:

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

OAuth 2.0およびGoogle Appsドメイン全体のユーザーデータへのアクセス権限の委任。ドメインはアプリケーションへのデータアクセス権を付与しています。

24
user1333358

最善の方法は、リクエストに常にuserId = "me"を含めることです。これにより、認証されたユーザーのメールボックスのみを使用するようにAPIに指示します。メールアドレスに依存する必要はありません。

44
Eric D

ユーザーはドメインに移行し、アカウントにはエイリアスが添付されていました。 SendAsアドレスをインポートされたエイリアスのいずれかにデフォルト設定し、それを自動化する方法が必要でした。 Gmail APIはソリューションのように見えましたが、アカウントを変更する役割を持つ特権ユーザーは機能していませんでした-「Delegation denied for for」403エラーが表示され続けました。

PHP 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

新鮮なメールID /アカウントのメールにアクセスしたかったのですが、最近発生した、JSONを含む '.credentials'を持つフォルダーは、以前に試した以前のメールID /アカウントに関連付けられていました。 JSONに存在するアクセストークンおよびその他のパラメーターは、新しい電子メールID /アカウントに関連付けられていません。したがって、実行するには、「。credentails」フォルダーを削除して、プログラムを再度実行するだけです。ここで、プログラムはブラウザを開き、許可を与えるように求めます。

Pythonでファイルを含むフォルダーを削除するには

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

これをプログラムの最後に追加できます

1
Sai Kiran