【问题标题】:Invalid grant when calling Java Google Drive Api with Service Account使用服务帐户调用 Java Google Drive Api 时授权无效
【发布时间】:2012-10-26 13:52:58
【问题描述】:

好的!正如标题所述,我在使用服务帐户时遇到了一些严重的身份验证问题。所以就从头开始吧,感觉什么都试过了!

服务设置为开启:

驱动 SDK 设置:

服务帐号 API 访问权限:

此处描述的 API 客户端访问:http://support.google.com/a/bin/answer.py?hl=en&answer=162106

代码:

public static void callSpreadsheetApi() {

        GoogleCredential credential = null;
        try {
            credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                    .setJsonFactory(JSON_FACTORY)                    
                    .setServiceAccountId("2363XXXXXX19.apps.googleusercontent.com")                    
                    .setServiceAccountScopes(DriveScopes.DRIVE, "https://spreadsheets.google.com/feeds", "https://docs.google.com/feeds")
                    .setServiceAccountPrivateKeyFromP12File(new File("/Users/stevesmith/Desktop/c02e064935d33c3389f6ab1dbf9ea747a5bdaac5-privatekey.p12"))
                    .setServiceAccountUser("steve.smith@reco.se")
                    .build();

        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        Drive drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();

        com.google.api.services.drive.model.File  file = new com.google.api.services.drive.model.File();
        file.setTitle("test");
        file.setMimeType("application/vnd.google-apps.spreadsheet");
        Drive.Files.Insert insert = null;
        try {
            insert = drive.files().insert(file);
            file = insert.execute();
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
}

例外情况:

[info] play - Application started (Dev)
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_grant"
}
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103)
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303)
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:340)
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:505)
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:266)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:857)
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:182)
    at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:279)
    at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207)
    at com.google.api.services.drive.Drive$Files$Insert.executeUnparsed(Drive.java:307)
    at com.google.api.services.drive.Drive$Files$Insert.execute(Drive.java:331)
    at services.GoogleService.callSpreadsheetApi(GoogleService.java:236)
    at controllers.Application.index(Application.java:26)
    at Routes$$anonfun$routes$1$$anonfun$apply$1$$anonfun$apply$2.apply(routes_routing.scala:32)
    at Routes$$anonfun$routes$1$$anonfun$apply$1$$anonfun$apply$2.apply(routes_routing.scala:32)
    at play.core.Router$HandlerInvoker$$anon$5$$anon$1.invocation(Router.scala:1090)
    at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:33)
    at play.core.j.JavaAction$class.apply(JavaAction.scala:74)
    at play.core.Router$HandlerInvoker$$anon$5$$anon$1.apply(Router.scala:1089)
    at play.core.ActionInvoker$$anonfun$receive$1$$anonfun$6.apply(Invoker.scala:126)
    at play.core.ActionInvoker$$anonfun$receive$1$$anonfun$6.apply(Invoker.scala:126)
    at play.utils.Threads$.withContextClassLoader(Threads.scala:17)
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:125)
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115)
    at akka.actor.Actor$class.apply(Actor.scala:318)
    at play.core.ActionInvoker.apply(Invoker.scala:113)
    at akka.actor.ActorCell.invoke(ActorCell.scala:626)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197)
    at akka.dispatch.Mailbox.run(Mailbox.scala:179)
    at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:516)
    at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259)
    at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
    at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
    at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)

过去 3 个小时我一直在浏览网页,所有 PHP 和 Python 人员似乎都通过在他们的 linux 生产服务器上设置正确的时间来解决这个问题。我坐在 MacOS Snow Leopard 中,我尝试过设置时间,但没有运气。我也尝试过创建一个新密钥。改变范围。添加不同的 ServiceAccountUsers 等等。我可能错过了一些关键部分,或者它可能是超级简单的?我的想法不多了!

【问题讨论】:

    标签: java google-api google-drive-api


    【解决方案1】:

    你试过单作用域吗:

     .setServiceAccountScopes("https://www.googleapis.com/auth/drive")
    

    和,

     .setServiceAccountId("23636812XXXX.apps.googleusercontent.com") 
    

    应该是

     .setServiceAccountId("2363681XXXX@developer.gserviceaccount.com")
    

    电子表格需要其他范围,但(目前)不需要。

    另外,请参阅此相关question

    【讨论】:

    • 嗯得到一个 com.google.api.client.googleapis.json.GoogleJsonResponseException: 500 Internal Server Error { "code" : 500, "errors" : [ { "domain" : "global", “消息”:“内部错误”,“原因”:“内部错误”}],“消息”:“内部错误”}
    • 我花了一段时间才开始工作。我的建议是创建一个干净的示例,甚至可以在 api 控制台中创建一个新应用程序。删除所有分析内容,只关注第一步,创建驱动文档。或者,暂时跳过驱动器文档的创建,手动创建一个并将其用于电子表格内容。尝试隔离问题。我也确实遇到了这 500 个错误,但随机且很少。
    • 我找到了这个stackoverflow.com/questions/12511656/… 并尝试创建一个文件夹:file.setMimeType("application/vnd.google-apps.folder");那里没有错误。假设这有效吗?我在哪里可以找到这个文件夹?
    • 如果你创建了一个文件夹,你创建了一个谷歌驱动文件,概念是一样的。所以是的,它奏效了。以用户身份(“steve.smith@reco.se”)登录并查看驱动器
    • 天哪,它成功了!耶哈!您能否更改您的答案以包含指向 500 错误的链接,我会检查它们。还有一个问题,您之前必须创建一个文件夹还是已经有一个文件夹?
    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2014-12-18
    • 2020-02-22
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多