【问题标题】:TokenResponseException: 401 UnauthorizedTokenResponseException: 401 未经授权
【发布时间】:2016-12-27 11:16:57
【问题描述】:

我想使用服务帐户实现 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();

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

【问题讨论】:

    标签: java google-api google-api-java-client google-sheets-api google-authenticator


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      根据Standard Error Responses,错误 401 是由于invalidCredentials 而导致的,这表明身份验证令牌无效或已过期。

      推荐操作:

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

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

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

      希望有帮助!

      【讨论】:

      • 我在每次调用前都测试过刷新令牌,但结果是一样的。
      • 您可能需要检查此SO post 中给出的解决方案,其中如果令牌无效,则需要执行给定的步骤。
      猜你喜欢
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 2018-05-19
      • 2020-06-11
      • 2017-02-22
      • 2018-10-08
      • 2018-01-05
      相关资源
      最近更新 更多