我是使用Google API的新手,但我有一个项目要求我访问他们的域名以通过电子邮件查找用户的经理。在我开始编写代码之前,我想要设置所有内容,因此我按照example file进行了PHP操作。我能够让它工作,但是在令牌过期时刷新令牌有一些问题并且研究推动我使用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."
}
}
我假设这意味着它不知道帐户域,但我不知道如何解决这个问题。我认为,如果这是一个权限问题,谷歌会告诉我。我尝试在线搜索,但没有运气,因为我发现的问题是使用不同的方法,并且修复不是可以在服务帐户上完成的。我现在被卡住了,所以我希望朝着正确的方向努力让我走上正轨。
这是我正在使用的测试脚本:
<?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 :(得分:11)
好的,这是一个非常容易忽视的步骤,但这是一个非常简单的修复。
此处的问题是该帐户的域名未被识别。我的印象是服务帐户已经附加到域,但事实并非如此。因此,修复只是添加到客户端的一行代码,以将其设置为域中的用户(对于我的情况)。
我的修正是添加:
$client->setSubject('account@domain.com');
到我的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('account@domain.com');
return $client;
}
我看到这提到了in the API,但它说它是可选的。希望这也会帮助其他人。
答案 1 :(得分:1)
对我来说是同样的错误,但我需要与服务帐户电子邮件(在json auth文件中找到)共享我的日历。在那之后,错误消失了。
答案 2 :(得分:0)
对于我来说,这是我通过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));