0

我想使用服务帐户实现 Google Sheet API 请求。我创建了这段代码:

HttpTransport httpTransport = new NetHttpTransport();
        JacksonFactory JSON_FACTORY = new JacksonFactory();

        ClassLoader classLoader = this.getClass().getClassLoader();
        java.io.File path = new java.io.File(classLoader.getResource("i-6dc0c917ee63.p12").getFile());

        GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId("test221@sonora-project.iam.gserviceaccount.com")
            .setServiceAccountPrivateKeyFromP12File(path)
            .setServiceAccountScopes(Arrays.asList(SheetsScopes.SPREADSHEETS))
            .setServiceAccountUser("sonoraw@gmail.com")
            .build();

        Sheets service = new Sheets.Builder(httpTransport, JSON_FACTORY, null)
            .setApplicationName("project")
            .setHttpRequestInitializer(credential).build();

        Sheets.Spreadsheets spreadsheets = service.spreadsheets();
        Spreadsheet includeGridData = spreadsheets.get(spreadsheetId).execute();

但我得到这个错误:

com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized

在这个方法.execute();

你知道我该如何解决这个问题吗?

4

2 回答 2

1

我遇到了同样的问题,这让我发疯了。我有同一个应用程序的 2 个不同副本,使用相同的 credentials.json,但我会在一个中获得成功响应,但在另一个中获得 401 未授权。我终于通过删除StoredCredential. 所以下次我运行我的应用程序时,我被带到了谷歌的身份验证页面,并且它有效。

TLDR:删除StoredCredential 找到它的一种方法是find . -name 'StoredCredential'从应用程序的根目录运行。

于 2020-07-01T21:53:18.867 回答
0

根据标准错误响应,错误 401 是由于invalidCredentials,这表明身份验证令牌无效或已过期。

建议操作:

不要在未解决问题的情况下重试。您需要获得一个新的身份验证令牌。

有了这个,您可能需要检查Token Expiration,其中提到您必须编写代码来预测授予的令牌可能不再起作用的可能性。它还给出了令牌可能停止工作的这些可能原因:

  • 用户已撤销访问权限。
  • 该令牌已六个月未使用。
  • 用户更改了密码,并且令牌包含 Gmail 范围。
  • 用户帐户已超过一定数量的令牌请求。

希望有帮助!

于 2016-12-28T09:40:33.040 回答