TokenResponseException:401 Unauthorized

时间:2016-12-27 11:16:58

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

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

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

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,这让我发疯。我有两个相同应用程序的不同副本,使用相同的certificate.json,但是我在其中一个中获得了成功的响应,但在另一个中却获得了未经授权的401。我终于通过删除StoredCredential解决了它。因此,下次我运行我的应用程序时,我被带到Google的身份验证页面,并且可以正常运行。

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

答案 1 :(得分:0)

基于Standard Error Responses,错误401归因于invalidCredentials,这表示身份验证令牌无效或已过期。

推荐的操作:

  

如果不解决问题,请勿重试。您需要获得新的身份验证令牌。

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

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

希望有所帮助!