2014-12-17 8 views
7

ricevo una NullPointerException con molto piccolo dettaglio quando tento di setServiceAccountUser(ACCOUNT_TO_IMPERSONATE) sul mio GoogleCredential, costruire una Google Tasks servizio oggetto e successivamente provare a inviare una richiesta di un elenco di attività da ACCOUNT_TO_IMPERSONATE.NullPointerException solo dopo che ho setServiceAccountUser() per oggetto GoogleCredential (Grails/Java)

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 

Si prega di notare che il credential.getServiceAccountUser() disconnette l'atteso ACCOUNT_TO_IMPERSONATE.

c'era un problema simile riportato nel 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) 
... 

La mancanza di dettaglio l'errore è stato detto di essere un problema nelle versioni precedenti di Google Tasks, ma ho aggiornato alla versione più recente e vedere alcuna differenza .

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

EDIT: Dopo armeggiare con il codice nella console graal nella nostra applicazione web che posso vedere che l'esecuzione credential.refreshToken() provoca la NPE quando ServiceAccountUser è impostato.

Quando si disinserisce ServiceAccountUser, refreshToken() ha esito positivo. Inoltre, il tentativo di recuperare un elenco di Google Tasks ha esito positivo per l'account del servizio quando lo ServiceAccountUser non è impostato.

Qualsiasi aiuto sarebbe molto apprezzato.

+0

Hai guardato Questo? http://stackoverflow.com/questions/12479551/google-drive-oauth-cant-figure-out-how-to-usable-googlecredentials – user1807337

risposta

2

Ho scoperto il motivo del comportamento che stavamo vivendo, ma grazie per i vostri suggerimenti, in ogni caso, user1807337 & Srinivasan.

Abbiamo bisogno di convincere gli utenti dell'applicazione a delegare l'autorizzazione a livello di dominio alla nostra applicazione. Questo può essere fatto da parte di Google del organisataion Apps, seguendo le istruzioni riportate nella sottosezione intitolata Delega autorità a livello di dominio per l'account del servizio

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

Ecco la spiegazione data nella stessa risorsa: "Se hai delegato l'accesso al dominio all'account del servizio e desideri impersonare un account utente, specifica l'indirizzo email dell'account utente con il metodo setServiceAccountUser del factory GoogleCredential ..."

0

Prova questo

'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_origine_builder.setServiceAccountUser ("[email protected]");'

+1

Siamo in grado di autenticare utilizzando le credenziali dell'account di servizio, il problema è che non siamo in grado di impersonare un altro utente appartenente al nostro dominio. – rcgeorge23