2016-10-12 11 views
11

Google APIを初めて使用していますが、メールでユーザーのマネージャーを探すためにドメインにアクセスする必要があるプロジェクトがあります。コードを開始する前に、すべてを設定したかったので、私はPHPのためにexample fileに従っていました。私はそれを動作させることができましたが、期限切れになるとトークンをリフレッシュする際にいくつかの問題がありました。Service Accountを使用するように研究が促されました。これはサーバーのcronスクリプトであり、ユーザーのやりとりを扱いたくありません。Google API:404ドメインが見つかりません

私はサービスアカウントを作成したが、Gスイートドメイン全体の委任を有効にし、ためにアクセスを追加しました:私は私のスクリプトでGoogle_Service_Exceptionを取得https://www.googleapis.com/auth/admin.directory.user.readonly

応答は次のとおりです。

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

私は、これはそれがアカウントドメインを知らないが、私は、私はこれを解決する方法を見ていないことを意味と仮定しています。私は、これが権限の問題であれば、Googleが教えてくれると思います。私はオンラインで検索しようとしましたが、見つけた問題は別の方法を使用していたため、修正はサービスアカウントで実行できませんでした。私は今すぐ立ち往生しているので、正しい方向へのプッシュが私を軌道に乗せることを願っています。

これは私が使用していたテストスクリプトです:

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

service_account.jsonは、(明らか洗浄)この上の任意の支援のための

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

感謝が含まれています。

+0

このスレッドに示すように、ユーザーオブジェクトをスキーマに作成してみてください。http://stackoverflow.com/questions/23767994/404-resource-not-found-domain-with-google-direcotry-api –

+0

彼はユーザーを追加していますが、まったく同じケースではありませんが、依然としてオブジェクトを使用してリクエストを作成しようとしました。 RubyのAPIはちょっと違うので、私は同じメソッドを持っていなかったので、私は同じエラーが返ってきたので、正しく処理したと仮定します。私は現在、自分自身のAPIコードを使って、自分のドキュメントよりも使い方を理解できるかどうかを確認しています。試してくれてありがとう – Jeremy

答えて

8

これは間違いのない簡単なステップでしたが、非常に簡単な修正でした。

ここでの問題は、アカウントのドメインが特定されなかったことです。サービスアカウントが既にドメインに接続されているという印象を受けましたが、そうではありません。したがって、この修正は、ドメインにあるユーザー(私の場合)に設定するためにクライアントに追加するコードの1行です。

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

getClient方法に:

私の修正は、追加することでした。

のようなので、今の方法が見えます。私は、これはin the APIを述べたが、それは、オプションとして、それを述べました

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

。うまくいけば、これは他の人にも役立つでしょう。

0

は私と同じエラーでしたが、私はカレンダーをサービスアカウントの電子メール(jsonの認証ファイルにあります)と共有する必要がありました。その後、エラーは消えた。

関連する問題