2016-10-12 32 views
11

Tôi mới làm việc với API Google nhưng tôi có một dự án yêu cầu tôi truy cập miền của họ để tìm người quản lý của người dùng bằng email. Trước khi tôi bắt đầu viết mã, tôi muốn thiết lập mọi thứ để tôi theo dõi example file cho PHP. Tôi đã có thể làm cho nó hoạt động nhưng đã có một số vấn đề với làm mới các mã thông báo khi nó hết hạn và nghiên cứu đẩy tôi theo hướng sử dụng một Service Account, vì đây là một kịch bản cron máy chủ và tôi không muốn đối phó với bất kỳ tương tác người dùng.Google API: 404 Không tìm thấy miền

tôi tạo ra các tài khoản dịch vụ, kích hoạt Đoàn G Suite Domain-rộng, và thêm vào truy cập cho: https://www.googleapis.com/auth/admin.directory.user.readonly

tôi nhận được một Google_Service_Exception với kịch bản của tôi.

Câu trả lời là:

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

Tôi giả định này có nghĩa là nó không biết lĩnh vực tài khoản nhưng tôi không thấy làm thế nào tôi có thể giải quyết này. Tôi cho rằng nếu đây là vấn đề về quyền, Google sẽ cho tôi biết. Tôi đã thử tìm kiếm trực tuyến nhưng không may mắn vì các vấn đề tôi tìm thấy đã sử dụng một phương pháp khác và các bản sửa lỗi không phải là thứ có thể được thực hiện trên Tài khoản dịch vụ. Tôi đang mắc kẹt ngay bây giờ vì vậy tôi hy vọng một cú đẩy đúng hướng sẽ giúp tôi đi đúng hướng.

Đây là kịch bản thử nghiệm Tôi đang sử dụng:

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

My service_account.json chứa (làm sạch rõ ràng)

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

Thanks cho bất kỳ sự trợ giúp về vấn đề này.

+0

thử tạo đối tượng người dùng vào giản đồ như được hiển thị trong chuỗi này http://stackoverflow.com/questions/23767994/404-resource-not-found-domain-with-google-direcotry-api. –

+0

Anh ấy đang thêm người dùng, không chính xác cùng một trường hợp nhưng tôi vẫn cố gắng sử dụng một đối tượng để thực hiện yêu cầu. API của Ruby có một chút khác biệt nên tôi không có cùng phương pháp bởi những gì tôi có thể nhận được vẫn cho tôi lỗi tương tự vì vậy tôi cho rằng tôi đã làm đúng. Tôi hiện đang tự mình kiểm tra mã API để xem liệu tôi có thể hiểu cách sử dụng nó tốt hơn tài liệu của họ hay không. Cảm ơn vì đã thử – Jeremy

Trả lời

8

Được rồi, đây là một bước rất dễ bỏ qua nhưng đó là một sửa chữa cực kỳ đơn giản.

Vấn đề ở đây là miền cho tài khoản không được xác định. Tôi đã có ấn tượng rằng tài khoản dịch vụ đã được gắn với miền nhưng điều đó không đúng. Vì vậy, sửa chữa chỉ là một dòng mã để thêm vào máy khách để thiết lập nó cho người dùng trong miền (đối với trường hợp của tôi).

Việc sửa chữa đối với tôi là để thêm:

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

phương pháp getClient tôi.

vì vậy bây giờ phương pháp này trông giống như:

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

Tôi thấy điều này đề cập in the API nhưng lại tuyên bố nó như là không bắt buộc. Hy vọng rằng điều này sẽ giúp người khác quá.

0

đối với tôi là lỗi tương tự, nhưng tôi cần chia sẻ lịch của mình với email tài khoản dịch vụ (được tìm thấy trong tệp xác thực json). Sau đó, lỗi biến mất.

Các vấn đề liên quan