私はGoogle APIを初めて使用しましたが、メールでユーザーのマネージャーを見つけるためにドメインにアクセスする必要があるプロジェクトがあります。コードを始める前に、すべてを設定したかったので、PHPの example file に従いました。私はそれを機能させることができましたが、トークンが期限切れになり、調査により Service Account の使用に向かったため、これがサーバーcronスクリプトであり、私はしたくないので、いくつかの問題がありましたユーザーインタラクションを処理します。
サービスアカウントを作成し、G Suiteドメイン全体の委任を有効にして、次のアクセスを追加しました:https://www.googleapis.com/auth/admin.directory.user.readonly
Google_Service_Exception
私のスクリプト。
応答は次のとおりです。
{
"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"
}
これについて支援をありがとう。
さて、これは見過ごすのが非常に簡単な手順でしたが、非常に単純な修正でした。
ここでの問題は、アカウントのドメインが識別されなかったことです。サービスアカウントは既にドメインにアタッチされているように見えましたが、そうではありません。したがって、修正は、ドメインにいるユーザーに設定するためにクライアントに追加するコードの1行にすぎません(私の場合)。
私のための修正は追加することでした:
$client->setSubject('[email protected]');
私のgetClient
メソッドに。
したがって、メソッドは次のようになります。
/**
* 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;
}
私はこれが APIで と述べているのを見ましたが、それはオプションとして述べています。うまくいけば、これは他の人にも役立ちます。
私にとっても同じエラーでしたが、サービスアカウントのメール(json authファイルにある)とカレンダーを共有する必要がありました。その後、エラーは消えた。
私の場合、listUsers()関数で渡したドメイン値がこのエラーの原因でした。 GSuiteの私のドメインがxyz.comで、次のようなものを試したとします
$dir = new \Google_Service_Directory($googleClient);
$dir->users->listUsers(array('domain' => 'abc.com', 'maxResults' => 500));
代わりに、以下のように「ドメイン」の値に正しいドメイン名を使用する必要があります。
$dir = new \Google_Service_Directory($googleClient);
$dir->users->listUsers(array('domain' => 'xyz.com', 'maxResults' => 500));