Google Apps Admin API:需要为服务帐户指定帐户用户吗?

时间:2014-06-19 11:51:40

标签: java google-apps google-apps-marketplace

我正在创建一个应该能够读取域的所有用户的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>")
    ...

有效!

但我怎么知道管理员的电子邮件地址? 我可以在没有电子邮件地址的情况下使其工作吗?

3 个答案:

答案 0 :(得分:6)

没有。您必须拥有并知道允许执行您想要的帐户的电子邮件地址(通常是超级拉丁语)。

我同意某些API要求这样做(管理员,目录等)是非常荒谬的。

答案 1 :(得分:2)

我们完全一样&#34;麻烦&#34;当试图确定用户是否是域管理员时。 我们使用与您相同的范围,类似的代码(在PHP中)与您的相同:

$email = 'an_user_from_not_our_domain@domain.com';

$config = array(
    'key' => "path/to/private/key",
    'name' => "xxxxxxxxxxxxxxx@developer.gserviceaccount.com",
    '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();

当我们仅为自己的域安装应用时 - 我们可以获得&#34; isAdmin&#34;值。 当我们将应用程序安装到其他域时,它不起作用并返回相同的&#34;未授权访问此资源/ api&#34;。

也许是针对Directory API的目的而设计的?我的意思是,使用我们自己的域而不是安装我们的应用程序的域。 不推荐使用的Provisioning API允许获取此类信息。现在我们无法确定用户是否是域管理员。

答案 2 :(得分:1)

几天前,Google现在允许任何用户列出域中的用户(也包括子域名)。

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

但是,这有两个限制,这意味着我不能从我的特定用例中受益。

  1. 您仍需要一个(有效)用户名来提出请求,如果您无法列出用户,您将如何获得该用户名?我可能有注册用户名,但该帐户可能随时被删除。仍然赶上22。

  2. 如果您使用的是非管理员帐户,则必须将viewType设置为&#34; domain_public&#34;,这意味着您只能看到可用字段的子集。 &#34;暂停&#34;字段不是其中之一,您也不会在响应中获得任何已暂停的用户。 (此处提供文档:https://developers.google.com/admin-sdk/directory/v1/reference/users/list

  3. 我可以忍受&#34;暂停&#34;限制,但由于我无法获得没有用户的用户列表,这对我没有帮助。