java - 执行 Google Apps 全域授权

标签 java google-drive-api

我正在尝试在我的应用程序服务帐户和我的组织(在 admin.google.com 上)之间进行全域授权。我关注了this指导,大约三遍,我不知道我错过了哪里,它不起作用。我的应用程序无法对组织内的用户进行拟人化。

API 的响应是这样说的:

 Exception in thread "main" com.google.api.client.auth.oauth2.TokenResponseException: 403 Forbidden
{
  "error" : "access_denied",
  "error_description" : "Requested client not authorized."
}
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:268)
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
    at StorageSample.main(StorageSample.java:156)

这是我的唯一代码,用于测试:

 String emailAddress = "zzzzzzzzzzzzz@developer.gserviceaccount.com";
            JsonFactory JSON_FACTORY =          JacksonFactory.getDefaultInstance();
            HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

            //scopes
            List scopes = new ArrayList();
            scopes.add(DriveScopes.DRIVE);
            scopes.add(DriveScopes.DRIVE_APPDATA);
            scopes.add(DriveScopes.DRIVE_APPS_READONLY);
            scopes.add(DriveScopes.DRIVE_FILE);

            GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(emailAddress)
            .setServiceAccountPrivateKeyFromP12File(new File("valid_path_to_secrets.p12"))
            .setServiceAccountScopes(scopes)
            .setServiceAccountUser("test@mydomain.com.br") // HERE THE USER I WANT TO PERSONIFICATE
            .build();

            Drive drive = new Drive.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName("Test").build();

            String myName = drive.about().get().execute().getName();
            com.google.api.services.drive.Drive.Files.List files = drive.files().list();
            FileList fileList = files.execute();
            List<com.google.api.services.drive.model.File> xFiles = fileList.getItems();

            System.out.println("here");
            for (com.google.api.services.drive.model.File f : xFiles){
                System.out.println("DEBUG "+f.getOriginalFilename());
                System.out.println(f.getDownloadUrl());
                System.out.println(f.getAlternateLink());
                System.out.println(f.getOwnerNames().get(0));
                System.out.println(f.getFileSize());
            }
        }

        }

如果我注释标记为 (setServiceAccountUser("test@mydomain.com.br") 的行,应用程序可以运行,但我想对该用户进行拟人化 test。这就是本指南的目的,向 mydomain.com.br 中的所有用户授予访问权限。

在 Google 指南的 Delegate domain-wide authority to your service account 部分中,如前所述,我遵循了所有步骤,注意步骤编号 6 :在 Security 部分下添加 admin.google.com 的范围。 (应用程序的谷歌管理员配置) Here ir my google admin configuration for the app

最佳答案

您已授权 1 个云端硬盘范围的客户端 ID:

https://www.googleapis.com/auth/drive

此范围存储在 Java 中的常量 DriveScopes.DRIVE 下。

但是当您在代码中创建凭证时,您需要 4 个范围:

scopes.add(DriveScopes.DRIVE);
scopes.add(DriveScopes.DRIVE_APPDATA);
scopes.add(DriveScopes.DRIVE_APPS_READONLY);
scopes.add(DriveScopes.DRIVE_FILE);

我同意,由于 DriveScopes.DRIVE 是一个包含 Drive 中其他范围的范围,因此获得 DriveScopes.DRIVE 的授权似乎很正常,这意味着您获得所有其他云端硬盘范围的授权。

但事实并非如此,您必须在 Security 部分指定 all 您计划使用的范围。在你的情况下是:

https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/drive.appdata
https://www.googleapis.com/auth/drive.apps.readonly
https://www.googleapis.com/auth/drive.file

但由于所有这些范围都已包含在 https://www.googleapis.com/auth/drive 中,您还可以简单地从 Java 代码中删除其他范围。这就是我要做的:

...
List scopes = new ArrayList();
scopes.add(DriveScopes.DRIVE);
//No other scope

GoogleCredential credential = new GoogleCredential.Builder()
...

关于java - 执行 Google Apps 全域授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31130044/

相关文章:

java - hibernate 版本 4 jar,maven 依赖项不在存储库中 - 好吧,它在存储库中,但我的存储库是错误的

java - 如何在 docker 测试容器中添加运行参数

java - 如何在 Java 中使用 List、ArrayList 和/和 Array 创建二维数组

android - Google Drive REST API 是否仍需要 GET_ACCOUNTS 权限?

python-3.x - 使用 google-slides-api 自动生成 powerpoint

java - 如何正确使用hasNext?

java - IOS中的AES加密到JAVA中的解密

objective-c - 如何获取文件列表 Google Drive API IOS?

excel - 用于打开受密码保护的 Excel 的 Google Apps 脚本?

javascript - Google 云端硬盘上传文件大小限制