API администратора Google Apps: нужно указать пользователя учетной записи для учетной записи службы?

Я создаю приложение Marketplace, которое должно иметь возможность читать всех пользователей домена. Я запрашиваю доступ к этим областям:

https://www.googleapis.com/auth/userinfo.email  
https://www.googleapis.com/auth/userinfo.profile    
https://www.googleapis.com/auth/admin.directory.user.readonly

Затем при доступе к «Универсальному навигационному расширению» происходит следующее:

Credential credential = new GoogleCredential.Builder()
        .setTransport(httpTransport)
        .setJsonFactory(jsonFactory)
        .setServiceAccountId(SERVICE_MAIL)
        .setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY))
        .setServiceAccountPrivateKey(privateKey)
        .build();

Directory oauth2 = new Directory.Builder(httpTransport, jsonFactory, null)
        .setHttpRequestInitializer(credential)
        .build();

Directory.Users.List list = oauth2.users().list();
list.setDomain(queryParams.getString("domain"));
Users users = list.execute();

Когда я запускаю это, он возвращает эту ошибку:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Not Authorized to access this resource/api",
    "reason" : "forbidden"
  } ],
  "message" : "Not Authorized to access this resource/api"
}

Но когда я добавляю:

Credential credential = new GoogleCredential.Builder()
    .setServiceAccountUser("<admin-account>@<domain>")
    ...

Оно работает!

Но как узнать адрес электронной почты администратора? Могу ли я заставить его работать без адреса электронной почты?


person stephanos    schedule 19.06.2014    source источник


Ответы (3)


Нет. Вы должны иметь и знать адрес электронной почты учетной записи, которой разрешено делать то, что вы хотите (обычно это суперадминистратор).

Я согласен с тем, что для некоторых API совершенно абсурдно требовать этого (Admin, Directory и т. д.).

person AMS    schedule 20.06.2014

У нас точно такая же "проблема" при попытке определить, является ли пользователь администратором домена или нет. Мы используем те же области видимости, что и вы, аналогичный код (на PHP), как у вас:

$email = '[email protected]';

$config = array(
    'key' => "path/to/private/key",
    'name' => "[email protected]",
    'prn' => "app_domain_admin@app_domain.com"
);

$isAdmin = false;

$key     = file_get_contents($config['key']);
$scopes_ = array("https://www.googleapis.com/auth/admin.directory.user.readonly");
$gac     = new Google_AssertionCredentials($config['name'], $scopes_, $key, 'notasecret', 'http://oauth.net/grant_type/jwt/1.0/bearer', $config['prn']);

$client = new Google_Client();
$client->setApplicationName("Test App");
$client->setUseObjects(true);
$client->setAssertionCredentials($gac);

require_once 'GoogleApiClient/contrib/Google_DirectoryService.php';
$directory = new Google_DirectoryService($client);
$user = $directory->users->get($email);

if ($user instanceof Google_User)
    $isAdmin = $user->getIsAdmin();

Когда мы устанавливаем приложение только для своего домена, мы можем получить значение «isAdmin». И когда мы устанавливаем приложение в другие домены, оно не работает и возвращает то же самое «Не авторизован для доступа к этому ресурсу / API».

Может быть, это то, для чего предназначен Directory API? Я имею в виду, для работы с нашим собственным доменом, а не с доменами, которые устанавливают наше приложение. Устаревший API-интерфейс Provisioning API позволял получать такую ​​информацию. И теперь мы не могли определить, является ли пользователь администратором домена или нет.

person maghoth    schedule 20.06.2014

Несколько дней назад Google теперь позволяет любому пользователю перечислять пользователей в домене (включая субдомены).

http://googleappsupdates.blogspot.se/2014/09/new-features-in-admin-sdk-custom-user.html

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

  1. Вам все еще нужно (активное) имя пользователя, чтобы сделать запрос, и как вы собираетесь получить это имя пользователя, если вы не можете перечислить пользователей? У меня может быть имя пользователя из регистрации, но эта учетная запись может быть удалена в любое время. Еще поймать 22.

  2. Если вы используете учетную запись без прав администратора, вы должны установить для viewType значение «domain_public», что означает, что вы сможете видеть только подмножество доступных полей. Поле «приостановлено» не входит в их число, и вы также не получите в ответе ни одного приостановленного пользователя. (документация доступна здесь: https://developers.google.com/admin-sdk/directory/v1/reference/users/list)

Я мог бы жить с «приостановленным» ограничением, но, поскольку я не могу получить список пользователей, у которых еще нет пользователя, это мне не помогает.

person popstr    schedule 25.09.2014
comment
Спасибо, что добавили это! Хорошо знать! - person stephanos; 25.09.2014