访问被拒绝,请求的范围不允许使用Google服务帐户

时间:2014-01-30 09:45:53

标签: google-admin-sdk

从Google开发者控制台创建了一个项目并创建了一个服务帐户。下载了密钥库。 我需要使用google admin sdk来创建/删除/访问用户。 我看到了Admin SDK ON API& Auth-> API。由于范围错误而无法获得授权。

示例Java代码段

public boolean makeConnectionWithGoogleAPI(){

try{
           List<String> scopes = Arrays.asList("https://www.googleapis.com/auth/admin.directory.user",
                "https://www.googleapis.com/auth/admin.directory.user.readonly");

      HttpTransport httpTransport = new NetHttpTransport();
      JacksonFactory jsonFactory = new JacksonFactory();

      GoogleCredential credential = new GoogleCredential.Builder()
          .setTransport(httpTransport)
          .setJsonFactory(jsonFactory)
          .setServiceAccountId(clientEmail)
          .setServiceAccountUser(userId)
          .setServiceAccountScopes(scopes)
          .setServiceAccountPrivateKeyFromP12File(
              new java.io.File(privateKeyStoreLocation))
          .build();

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

      Directory.Users.List list = admin.users().list();
      Users users = list.execute();
      List<User> listUsers=users.getUsers();
      for(User user:listUsers){
          System.out.println(user.getId());
      }
      return true;
}catch(Exception e){
        e.printStackTrace();
}
  return false;
}

com.google.api.client.auth.oauth2.TokenResponseException:400错误请求 {   “错误”:“access_denied”,   “error_description”:“不允许请求的范围:https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.user.readonly” }     在com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)     在com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)

3 个答案:

答案 0 :(得分:6)

我们遇到了这个问题 - 在Google文档中没有这么清楚。

您为API创建的客户ID是您在API范围列表中为客户名称输入的内容。

转到此处输入您的项目。建立您希望有权访问的API:https://console.developers.google.com/project

然后在左侧的“凭据”标签上,创建新的OAuth客户端ID /名称信息。

您在此处获取客户名称,然后转到您的应用管理安全界面: https://admin.google.com/AdminHome?chromeless=1#OGX:ManageOauthClients 或者:Admin.google.com&gt;然后安全&gt;然后高级&gt;然后管理OAuth客户端

从开发人员控制台获取您在创建项目时收到的Client_ID,并将其指定为您希望授予API项目特定范围访问权限的客户名称。

对于我们来说,无论如何,这就解决了我们的访问拒绝错误。

谷歌因未正确记录此流程而感到羞耻。我们花了4天时间搞清楚。我们是一个.net商店,甚至他们的NuGet套餐都有拼写错误,拼写错误和资源缺失。非常令人沮丧的是没有更好地记录这么多步骤。

答案 1 :(得分:1)

我在提供的链接中找不到以下选项。我花了更多的时间在这上面。

  

https://admin.google.com/AdminHome?chromeless=1#OGX:ManageOauthClients   或者:Admin.google.com&gt;然后安全&gt;然后高级&gt;然后管理   OAuth客户端

谷歌是否有关于此的更新,如果有人有相关信息,请更新。 找出我的代码。

GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
          .setJsonFactory(JSON_FACTORY)
          .setServiceAccountId("xxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com")
          .setServiceAccountScopes(scopes)
          .setServiceAccountPrivateKeyFromP12File(new File("D:\\ref\\privatekey.p12"))
          .setServiceAccountUser("xxxxxxxxxxxxxxxxxxx")
          .build();
 Compute compute = new Compute.Builder(
          httpTransport, JSON_FACTORY, null).setApplicationName(APPLICATION_NAME)
          .setHttpRequestInitializer(credential).build();
Compute.Instances.List instances = compute.instances().list(projectId, zoneName);
    InstanceList list = instances.execute();

错误消息是

  

403 Forbidden {&#34;错误&#34; :&#34; access_denied&#34;,&#34; error_description&#34; :   &#34;不允许请求的范围:   https://www.googleapis.com/auth/compute&#34; }

答案 2 :(得分:0)

我有同样的问题403 access_denied并通过跟进行动进行修复。

如FurnGuy所述

https://admin.google.com/AdminHome?chromeless=1#OGX:ManageOauthClients或:Admin.google.com&gt;然后安全&gt;然后高级&gt;然后管理OAuth客户端

从开发人员控制台获取您在创建项目时收到的Client_ID,并将其指定为您希望授予API项目特定范围访问权限的客户名称。

enter image description here

客户端名称是您从开发人员控制台创建的客户端ID,并添加示例范围https://www.googleapis.com/auth/admin.directory.group,https://www.googleapis.com/auth/admin.directory.orgunit.readonly

您可以用逗号分隔,然后授权它。你可以在你当地的主机上试试:8888