7

当我NullPointerException尝试构建 Google 任务服务对象并随后尝试从.setServiceAccountUser(ACCOUNT_TO_IMPERSONATE)GoogleCredentialACCOUNT_TO_IMPERSONATE

def credential = new GoogleCredential.Builder()
    .setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(SERVICE_ACCOUNT_ID)
    .setServiceAccountPrivateKeyFromP12File(P12_FILE)
    .setServiceAccountScopes(GOOGLE_TASK_SCOPES)
    .setServiceAccountUser(ACCOUNT_TO_IMPERSONATE)
    .build()

    credential.refreshToken()
    log.debug("Google Credential Impersonating: ${credential.getServiceAccountUser()}")

    def service = new com.google.api.services.tasks.Tasks.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build()

    return service

请注意,credential.getServiceAccountUser()注销是预期的ACCOUNT_TO_IMPERSONATE

https://github.com/googleads/googleads-java-lib/issues/19中报告了类似的问题

StackTrace :
Caused by: java.lang.NullPointerException at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:191)
at com.google.api.client.util.Preconditions.checkNotNull(Preconditions.java:127)
at com.google.api.client.json.jackson2.JacksonFactory.createJsonParser(JacksonFactory.java:96)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:85)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:88)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.auth.oauth2.Credential.executeRefreshToken(Credential.java:570)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:247)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at com.google.api.ads.common.lib.auth.OAuth2Helper.callRefreshToken(OAuth2Helper.java:70)
at com.google.api.ads.common.lib.auth.OfflineCredentials.generateCredential(OfflineCredentials.java:144)
...

据说错误中缺少细节是旧版本的 Google Tasks 中的一个问题,但我已经升级到最新版本,没有发现任何区别。

compile "com.google.api-client:google-api-client:1.19.0"
compile 'com.google.apis:google-api-services-tasks:v1-rev41-1.19.0'

编辑:在我们的 Web 应用程序中修改 grails 控制台中的代码后,我可以看到在设置credential.refreshToken()时执行会导致 NPE ServiceAccountUser

当我取消设置时ServiceAccountUserrefreshToken()是成功的。ServiceAccountUser此外,如果未设置,则尝试检索服务帐户的 Google 任务列表是成功的。

任何帮助将不胜感激。

4

2 回答 2

2

我发现了我们遇到的行为的原因,但感谢您的建议,不过,user1807337 和 Srinivasan。

我们需要让应用程序的用户将域范围的权限委托给我们的应用程序。这可以由组织的谷歌应用程序管理员完成,按照标题为将域范围的权限委托给服务帐户的小节中的说明进行操作

https://developers.google.com/accounts/docs/OAuth2ServiceAccount

以下是同一资源中给出的解释:“如果您已委派服务帐户的域范围访问权限并且您想模拟用户帐户,请使用 GoogleCredential 工厂的 setServiceAccountUser 方法指定用户帐户的电子邮件地址。 。”

于 2015-01-02T16:27:54.927 回答
0

试试这个

'com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder credential_origine_builder = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId("[[]]")
                .setServiceAccountScopes(GOOGLE_TASK_SCOPES)
                .setServiceAccountPrivateKeyFromP12File(new File("cfg/file.p12"));

credential_origin_builder.setServiceAccountUser("user@domain.com");'

于 2014-12-25T13:46:31.867 回答