У меня проблема с реализацией Google Admin SDK на PHP. Это всегда дает ошибку
Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling POST
https://www.googleapis.com/admin/directory/v1/users: (403) Not Authorized to access this
resource/api' in ..\google-api-php-client\src\Google\Http\REST.php on line 79
Вот мой код:
<?php
session_start();
/* * **********************************************
Make an API request authenticated with a service
account.
* ********************************************** */
set_include_path("google-api-php-client/src" . PATH_SEPARATOR . get_include_path());
require_once 'Google/Client.php';
require_once 'Google/Service/Directory.php';
/* * **********************************************
ATTENTION: Fill in these values! You can get
them by creating a new Service Account in the
API console. Be sure to store the key file
somewhere you can get to it - though in real
operations you'd want to make sure it wasn't
accessible from the webserver!
The name is the email address value provided
as part of the service account (not your
address!)
Make sure the Books API is enabled on this
account as well, or the call will fail.
* ********************************************** */
$client_id = 'my_client_id'; //Client ID
$service_account_name = 'email'; //Email Address
$key_file_location = 'key.p12'; //key.p12
if ($client_id == '<YOUR_CLIENT_ID>' || !strlen($service_account_name) || !strlen($key_file_location)) {
echo missingServiceAccountDetailsWarning();
}
$client = new Google_Client();
$client->setApplicationName("appname");
$service = new Google_Service_Directory($client);
/* * **********************************************
If we have an access token, we can carry on.
Otherwise, we'll get one with the help of an
assertion credential. In other examples the list
of scopes was managed by the Client, but here
we have to list them manually. We also supply
the service account
* ********************************************** */
if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
$service_account_name, array('https://www.googleapis.com/auth/admin.directory.user'), $key
);
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();/* * **********************************************
We're just going to make the same call as in the
simple query as an example.
* ********************************************** */
$familyName = filter_input(INPUT_GET, 'familyname');
$givenName = filter_input(INPUT_GET, 'givenname');
$password = filter_input(INPUT_GET, 'password');
$primaryEmail = filter_input(INPUT_GET, 'email');
$user = new Google_Service_Directory_User();
$name = new Google_Service_Directory_UserName();
$name->setFamilyName($familyName);
$name->setGivenName($givenName);
$user->setName($name);
$user->setHashFunction("MD5");
$user->setPrimaryEmail($primaryEmail);
$user->setPassword(hash("md5", $password));
$result = $service->users->insert($user);
Там нет документации, и я очень запутался с этой ошибкой.
У меня была похожая проблема, пока я не установил «вспомогательную» учетную запись на объекте учетных данных, который является адресом электронной почты администратора, для которого вы хотите выполнить действие API.
Так что в Администраторе Служб Google для вашего домена я предполагаю, что вы создали пользователя и добавили его в роль администратора, которая имеет доступ API для пользователей, верно? В приведенном выше коде вам просто нужно добавить (с правильным адресом электронной почты, конечно):
$cred->sub = "[email protected]";
Добавьте это прямо перед:
$client->setAssertionCredentials($cred);
Я сделал полный пример для кого-то другого, на кого вы тоже можете ссылаться: https://gist.github.com/fillup/9fbf5ff35b337b27762a
У меня была похожая проблема, но я нашел решение этой проблемы, пройдя этот блог
http://michaelseiler.net/2014/12/16/google-admin-sdk-api-with-php/
Предполагая, что вы выполнили все необходимые настройки в консоли администратора (т.е. делегировали полномочия домена), затем обратите особое внимание на строку
`$cred = new Google_Auth_AssertionCredentials($service_account_name, array('https://www.googleapis.com/auth/admin.directory.user'), $key);`
это должно быть:
`$user_to_impersonate = '[email protected]';$scopes =array('https://www.googleapis.com/auth/admin.directory.user');$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
$scopes,
$key,
'notasecret', // Default P12 password
'http://oauth.net/grant_type/jwt/1.0/bearer', // Default grant type
$user_to_impersonate);`
Я изменил это и бум ….
Я думаю, что я получаю эту ошибку, когда я пытался запросить пользователя.
Во время создания части утверждения JWT_CLAIM вы должны указать учетную запись администратора домена, которую ваша учетная запись службы может олицетворять … эта часть была плохо документирована, я думал.
Я не знаю точно, как это делает библиотека Google php, но я не видел нигде в вашем коде, где вы указали адрес электронной почты этой учетной записи. Если вы посмотрели документацию oauth2 в разделе jwt_claim, то есть подраздел «Дополнительные утверждения», который гласит:
Чтобы получить токен доступа, который предоставляет приложению делегированный доступ к ресурсу, включите адрес электронной почты пользователя в заявку JWT, заданную в качестве значения подполя.
Мне пришлось включить эту учетную запись администратора в создание моего утверждения, прежде чем я мог даже запросить API directory.users.
Я прошу прощения, если это не полезно, но я не использую библиотеку для PHP, я строю свой собственный (с PHP).