Google Directory API returns Not Authorized when call users().list().execute()

后端 未结 4 1285
孤独总比滥情好
孤独总比滥情好 2020-12-17 05:06

I need to read the list of users (and groups) from my google domain.

So I went to my Google APIs Console and enabled Admin SDK and created a

相关标签:
4条回答
  • 2020-12-17 05:16

    Google Directory API works with Compute Engine default service account, you do not need to setup Google Drive domain-wide. The only thing: you have to set serviceAccountUser, which is not supported in JSON based credentials. So you can

    • use P12 keys
    • user JSON credentials with workaround:

    make credential copy:

    import static com.google.api.client.googleapis.util.Utils.getDefaultJsonFactory;
    import static com.google.api.client.googleapis.util.Utils.getDefaultTransport;
    
    private static final String APPLICATION_NAME = "AnyAppName";
    
    private final List<String> SCOPES = ImmutableList.of(
            DirectoryScopes.ADMIN_DIRECTORY_GROUP_MEMBER, DirectoryScopes.ADMIN_DIRECTORY_USER, DirectoryScopes.ADMIN_DIRECTORY_GROUP);
    
    private Directory service;
    
    @PostConstruct
    void init() throws GeneralSecurityException, IOException {
        GoogleCredential credential;
        try (InputStream is = new FileInputStream("./config/client_secret.json")) {
            credential = GoogleCredential.fromStream(is);
        }
        GoogleCredential credentialWithUser = new GoogleCredential.Builder()
                .setTransport(getDefaultTransport())
                .setJsonFactory(getDefaultJsonFactory())
                .setServiceAccountUser("admin@yourdomain.ru")  // <--- mail of domain's admin
                .setServiceAccountId(credential.getServiceAccountId())
                .setServiceAccountScopes(SCOPES)
                .setServiceAccountPrivateKey(credential.getServiceAccountPrivateKey())
                .setServiceAccountPrivateKeyId(credential.getServiceAccountPrivateKeyId())
                .setTokenServerEncodedUrl(credential.getTokenServerEncodedUrl()).build();
    
        service = new Directory.Builder(getDefaultTransport(), getDefaultJsonFactory(), credentialWithUser).setApplicationName(APPLICATION_NAME).build();
    }
    
     public void members() throws IOException {
        Members members = service.members().list("groupName@yourdomain.ru").execute();
        System.out.println(members);
     }
    

    For my trial G Suite account it works!

    0 讨论(0)
  • 2020-12-17 05:30

    you can go to "security" settings in the admin console (admin.google.com/AdminHome?chromeless=1&pli=1#SecuritySettings:); then click on advance settings > Manage third party OAuth Client access. After this map your client id(generated from appconsole code.google.com/apis/console under API access for oath2) and "One or More API Scopes". Use comma separated scopes as mentioned there. For google directory you can use https://www.googleapis.com/auth/admin.directory.group,https://www.googleapis.com/auth/admin.directory.user

    Hope after this it works :)

    0 讨论(0)
  • 2020-12-17 05:34

    You can grant the service account access to certain scopes in the Control Panel as explained in the Google Drive domain-wide documentation. Just use Admin SDK scopes instead.

    The application name is used in the User-Agent header of requests and so is not overly important, just use your apps name and maybe version.

    0 讨论(0)
  • 2020-12-17 05:42

    I had the exact same problem, and was stucked on this sample

    What helped me : 1/ I did not Delegate domain-wide authority to your service account, as suggested by Jay Lee. But after that, I still had the problem. 2/ Then, according to this post, the call to setServiceAccountUser(yourAdminAccount@yourDomain.com) is mandatory.

    0 讨论(0)
提交回复
热议问题