【问题标题】:drive.changes().watch returns GoogleJsonResponseException: 401 Unauthorized without any messagedrive.changes().watch 返回 GoogleJsonResponseException: 401 Unauthorized 没有任何消息
【发布时间】: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);
}

更多信息:

  1. 这是一个服务帐户。它具有所有者权限
  2. 我在本地计算机上使用它
  3. drive.files().list() 工作正常
  4. 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


【解决方案1】:

花了几个小时并更仔细地阅读了文档后,我终于找到了问题所在。

如推送通知文档 (https://developers.google.com/drive/v3/web/push) 中所述:

要使用推送通知,您需要做三件事:

  1. 注册接收 URL 的域。 ...

  2. 设置您的接收 URL,或“Webhook”回调接收器。

    这是一个 HTTPS 服务器,用于处理资源更改时触发的 API 通知消息。

  3. 为您要观看的每个资源端点设置通知通道。

    通道指定通知消息的路由信息​​。作为通道设置的一部分,您确定要接收通知的特定 URL。每当频道的资源发生变化时,Drive API 都会将通知消息作为 POST 请求发送到该 URL。

这意味着您应该拥有一个域并且您应该在 google 上确认它,然后才能使用 watch API。

附:我仍然认为在这种情况下回复GoogleJsonResponseException: 401 Unauthorized 是荒谬的,但希望它能帮助其他面临同样问题的人。

【讨论】:

  • 嗨@Saandji 你能帮我完成这项工作吗?我拥有一切,但仍然无法正常工作。 - 一个端点(我在域验证中验证并添加) - 接收成功作为 action.execute().toPrettyString() 的响应)但找不到我无法接收通知的原因
猜你喜欢
  • 2015-03-13
  • 2021-09-02
  • 1970-01-01
  • 2021-10-19
  • 2013-04-05
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多