401 Google Drive Service帐户身份验证中未经授权的异常

时间:2017-03-27 06:20:42

标签: java google-drive-api google-oauth google-api-java-client google-oauth2

我使用谷歌驱动器服务帐户来获取文件元数据&使用Using OAuth 2.0 for Server to Server Applications中描述的以下参考步骤,该代码仅适用于我之前8个月创建的一个Gmail帐户 但如果我创建新的Gmail帐户并执行以下代码,则会出现以下错误。

我们不在这里使用任何G套件。我无法确定OLD帐户和新帐户之间的区别,因为对于一个它可以工作而另一个它会抛出401异常,如下所示。我们在开发者控制台中为两个gmail帐户完成了几乎相同的设置。

错误追踪: -

Exception in thread "main" com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized
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:384)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at com.demo.google.auth.GDriveServiceAcctTest.main(GDriveServiceAcctTest.java:83)

我在开发者控制台中做了什么 - > 创建了新的服务帐户&生成p12文件。 启用了Google云端硬盘API和管理员SDK

该计划的输入是 - >

private static final String SERVICE_ACCT_ID="test-XXXX@YYYY.iam.gserviceaccount.com";
private static final String P12_FILE_PATH="D:\\XXXX-b9ryafcd4fb11c.p12";
private static final String ACCOUNT_USER="XXXX@gmail.com";
private static final String APPLICATION_NAME="ABCDEF";

源代码: -

public static void main(String[] args) throws Exception {
GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(SERVICE_ACCT_ID)
    .setServiceAccountPrivateKeyFromP12File(new java.io.File(P12_FILE_PATH))
    .setServiceAccountScopes(Collections.singleton(DriveScopes.DRIVE))
    .setServiceAccountUser(ACCOUNT_USER)
    .build();

Drive driveService = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();
FileList result = driveService.files().list().execute();
    List<File> files = result.getItems();

    if (files == null || files.size() == 0)
        System.out.println("No Folder found.");
    else
    {
        System.out.println("Files:" + files.size());
    folderID = files.get(0).getId();
        files = result.getItems();
        if (files == null || files.size() == 0)
               System.out.println("No files found");
        else {
           for (File file : files)
               {
            System.out.printf("%s (%s)\n", file.getTitle(), file.getId());
               }
        }
    }

}

如果有人有想法修复此401错误,请告诉我。感谢。

1 个答案:

答案 0 :(得分:1)

记住服务帐户不是你。必须预先授权服务帐户才能访问该驱动器帐户。您需要与您希望它能够访问的服务帐户共享目录或文件,就像您对任何用户一样。