Google Admin SDK PHP не может создать пользователя. Не авторизован

У меня возникла проблема с внедрением 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);

Документации нет, и я очень смущен этой ошибкой.


person saggaf.arsyad    schedule 25.09.2014    source источник


Ответы (3)


У меня была аналогичная проблема, пока я не установил учетную запись «sub» в объекте учетных данных, который является адресом электронной почты для административного пользователя, от имени которого вы хотите выполнить действие API.

Итак, я предполагаю, что в администраторе Google Apps для вашего домена вы создали пользователя и добавили его в роль администратора, которая имеет доступ через API к пользователям, верно? В приведенном выше коде вам просто нужно добавить (конечно, с правильным адресом электронной почты):

$cred->sub = "[email protected]";

Добавьте это прямо перед:

$client->setAssertionCredentials($cred);

Я сделал полный пример для кого-то еще, на который вы тоже можете сослаться: https://gist.github.com/fillup/9fbf5ff35b337b27762a

person Phillip    schedule 23.10.2014
comment
Спасибо за пример. - person Jeff Clemens; 24.04.2015

У меня была похожая проблема, но я нашел решение, просмотрев этот блог.

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);`

Я поменял и бум....

person BemdooO    schedule 20.04.2015

Я думаю, что получал эту ошибку, когда пытался запросить пользователя.

Во время создания части утверждения JWT_CLAIM вы должны указать учетную запись администратора домена, которую ваша учетная запись службы может олицетворять ... эта часть была плохо документирована, я думал.

я не знаю точно, как это делает библиотека php google, но я нигде не видел в вашем коде, где вы указываете адрес электронной почты этой учетной записи. если вы смотрели документацию oauth2, в разделе jwt_claim есть подраздел «дополнительные утверждения», в котором говорится:

Чтобы получить маркер доступа, предоставляющий приложению делегированный доступ к ресурсу, включите адрес электронной почты пользователя в набор утверждений JWT в качестве значения подполя.

Мне пришлось включить эту учетную запись электронной почты администратора в создание моего утверждения, прежде чем я смог даже запросить API directory.users.

прошу прощения, если это бесполезно, но я не использую библиотеку для php, я создаю свою собственную (с php).

person mr.ellis    schedule 13.10.2014