我使用谷歌驱动器服务帐户来获取文件元数据&使用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错误,请告诉我。感谢。
答案 0 :(得分:1)
记住服务帐户不是你。必须预先授权服务帐户才能访问该驱动器帐户。您需要与您希望它能够访问的服务帐户共享目录或文件,就像您对任何用户一样。