2014-10-01 27 views
14

Gmail API bir etki alanı için başarısız:Gmail API 403 hata kodu döndürür ve "Delegasyonu <user email> için engellendi" Bu hata iletileri alınırken

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 ve yetki Google Apps Alan-Geniş heyet kullanıyorum kullanıcı verilerine erişmek için Alan, uygulamaya veri erişim hakları verdi.

+1

Bu hata bizim için de oluşmaya başladı. Bugüne kadar hiç sorun yaşamadık. IMAP kullanıyorsak her şey yolunda - Gmail API ile ilgili bir sorun var gibi görünüyor. Google Yardımı ?? – PNC

+0

Bu daha önce çalıştı mı, yoksa sadece kırdı mı? Eğer kırıldıysa, kırdığı zamanı verebilir misin? Daha önce hiç çalışmadıysa, bir hizmet hesabı olduğunu doğrulayabilir misiniz, Cpanel'de beyaz listeye eklenmiş ve alan çapında kurulum hakkında daha fazla bilgi verebilir misiniz? Şunun gibi bir şey kullanıyorsunuz: https://developers.google.com/accounts/docs/OAuth2ServiceAccount#formingclaimset Hayal ediyorum? –

+1

Ayrıca, isteklerinizdeki "userId" alanı için kullandığınız değeri yayınlayabilir misiniz? Kullanıcının e-posta adresi auth jetonu veya başka bir şeyle eşleşmesi gereken "ben" mi? –

cevap

33

Yapmanız gereken en iyi şey, isteklerinizi her zaman userId = "me" değerine sahip olmaktır. Bu, API’nın yalnızca kimliği doğrulanmış kullanıcının posta kutusunu kullanmasını söyler; e-posta adreslerine güvenmeye gerek yoktur.

+5

Kodumu, gerçek bir e-posta adresi yerine "beni" kullanacak şekilde değiştirdim. Sorun, e-posta adresimin örneğimde bir takma ad olmasıyla oluştu. – PNC

+2

E-posta adresini "ben" olarak değiştirmek benim için de çalıştı. Teşekkür ederim. – user1333358

+3

@ user1333358 cevabı kabul etmelisiniz - – koma

1

Kullanıcılarımız bir alana taşınmış ve hesabının takma adları takılıydı. SendAs adresini içe aktarılan takma adlardan birine varsayılan olarak ayarlamamız ve otomatikleştirmenin bir yolunu bulmamız gerekiyordu. Gmail API'sı çözüm gibi görünüyordu, ancak hesaplarda değişiklik yapmak için rolleri olan ayrıcalıklı kullanıcımız çalışmıyordu - "Yetkilendirme reddedildi" 403 hatasını görmeye devam ettik.

SendA'ların ayarlarını nasıl listeleyebildiğimizi gösteren bir PHP örneği.

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


?>