2016-10-12 44 views
11

Google API ile çalışmaktan çok memnunuz ancak e-posta ile bir kullanıcının yöneticisini bulmak için alan adlarına erişmemi gerektiren bir projem var. Kodu açmadan önce her şeyi ayarlamak istedim, böylece PHP için example file'u takip ettim. Çalışmayı başarabiliyordum ancak zaman dolduğunda jetonu yenilemekle ilgili bazı sorunlar vardı ve araştırma beni bir sunucu cron betiği olduğu için Service Account kullanmam için itti ve herhangi bir kullanıcı etkileşimi ile uğraşmak istemiyorum. Google API: 404 Etki Alanı bulunamadı

ben Servis Hesabı oluşturmuş, G Suite alan adı çapında Heyeti etkin ve erişimini ekledi: https://www.googleapis.com/auth/admin.directory.user.readonly

Senaryomun ile Google_Service_Exception olsun.

yanıttır:

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

bu, bu, hesaplar etki alanını bilmiyor ama ben bu sorunu çözmek nasıl görmüyorum anlamına varsayıyorum. Bu bir izin sorunu olsaydı, Google'ın bana söyleyeceğini varsayardım. Çevrimiçi arama yapmayı denedim, ancak bulduğum sorunlar farklı bir yöntem kullanıyordu ve düzeltmeler Hizmet Hesabı'nda yapılabilecek bir şey değildi. Şu an takıldım, bu yüzden doğru yönde bir itmenin beni takip edeceğini umuyorum. Bu konuda herhangi bir yardım için

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

Benim service_account.json (besbelli temizlenmiş) içerir

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

Teşekkür:

Bu

kullanıyorum test komut dosyası olan.

+0

bu iplik http://stackoverflow.com/questions/23767994/404-resource-not-found-domain-with-google-direcotry-api gösterilen şemaya bir kullanıcının nesneyi oluşturma deneyin. –

+0

Tam olarak aynı durumda değil, bir kullanıcı ekliyor ama yine de istekte bulunmak için bir nesne kullanmaya çalıştım. Ruby'nin API'si biraz farklıydı, ben de aynı hataları yapmadığım için hala aynı hatayı veremedim, bu yüzden doğru bir şekilde yaptığımı farz ediyorum. Şu anda API kodlarını kendimden daha iyi kullanıp kullanamayacağımı anlayabiliyor muyum diye bakıyorum. Teşebbüs için teşekkürler – Jeremy

cevap

8

Tamam, bu gözden kaçırmak çok kolay bir adım ama son derece basit bir düzeltme oldu.

Buradaki sorun, hesabın etki alanının tanımlanmamış olmasıdır. Hizmet hesabının etki alanına zaten bağlı olduğu izlenimindeydim, ancak durum böyle değil. Bu nedenle, düzeltme, istemciye etki alanında bulunan bir kullanıcıya (benim durumum için) ayarlamak için eklenecek bir kod satırıdır.

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

benim getClient yönteme:

benim için düzeltme eklemek oldu. Bu in the API belirtildiği gördü

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

ama isteğe bağlı olarak devletler: gibi

şimdi yöntem görünüyor. Umarım bu da başka birine yardımcı olur. Benim için

0

aynı hata oldu, ama hizmet hesabının e-posta (Bu json auth dosyasındakiler) ile benim takvimi paylaşmak gerekiyordu. Bundan sonra, hata ortadan kalktı.