【发布时间】:2017-05-02 05:43:53
【问题描述】:
我正在尝试查看 Google 云端硬盘中的更改,并收到 401 异常。在这里搜索,我发现人们有详细的消息,为什么他们没有未经授权而我一无所有。
这里是我使用的代码:
public static void main(String[] args) {
try {
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);
// authorization
GoogleCredential credential = GoogleCredential.getApplicationDefault()
.createScoped(DriveScopes.all());
boolean refreshed = credential.refreshToken();
// set up the global Drive instance
drive = new Drive.Builder(httpTransport, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
Channel channel = new Channel();
channel.setId(UUID.randomUUID().toString());
channel.setType("web_hook");
//my ip here
channel.setAddress("https://com.example:");
StartPageToken pageToken = drive.changes().getStartPageToken().execute();
System.out.println(pageToken.getStartPageToken());
Channel changesChannel = drive.changes().watch(pageToken.getStartPageToken(), channel).execute();
System.out.println(changesChannel.getExpiration());
return;
} catch (IOException e) {
System.err.println(e.getMessage());
e.printStackTrace();
} catch (Throwable t) {
t.printStackTrace();
}
System.exit(1);
}
更多信息:
- 这是一个服务帐户。它具有所有者权限
- 我在本地计算机上使用它
- drive.files().list() 工作正常
- drive.about().get() 工作正常
我得到的例外是:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized 在 com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145) 在 com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113) 在 com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) 在 com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321) 在 com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065) 在 com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 在 com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 在 com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 在 main.lambda.GoogleDrive2.main(MyClass.java:142)
我的 pom.xml 依赖项:
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.20.0</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client</artifactId>
<version>1.22.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client-extensions -->
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client-extensions</artifactId>
<version>1.6.0-beta</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client-jetty</artifactId>
<version>1.22.0</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-drive</artifactId>
<version>v3-rev70-1.22.0</version>
</dependency>
【问题讨论】:
-
您使用的代码对我来说看起来像 Oauth2 而不是服务帐户。请包含您的服务帐户的身份验证代码。这是分析,但它可能有助于作为参考developers.google.com/analytics/devguides/reporting/core/v3/…
-
嗨@DaImTo 这是一个服务帐户。我用过这个:➜ ~ gcloud auth activate-service-account --key-file=/path/to/my/file 在本地激活它,然后使用 GoogleCredential.getApplicationDefault().. 它需要这些凭据
-
你能试试像文件列表这样简单的东西吗?我认为这是您的服务帐户无权观看该文件的权限问题。
-
@DaImTo 是的,我已经尝试过了。请参阅“更多信息”部分。尝试过的 files().list() 和 about().get() 都很好用。
-
401 表示访问令牌无效(格式错误、过期等),或者访问令牌未创建具有必要范围以授权您尝试的操作。
标签: java google-drive-api google-api-java-client