2012-11-06 1 views
5

Je souhaite obtenir un nouveau "jeton d'accès" basé sur le "jeton d'actualisation" enregistré dans la base de données.(JAVA) Google API analytics - impossible d'obtenir un nouveau "jeton d'accès" en utilisant "refresh token"

Voici le code que j'ai écrit:

GoogleCredential.Builder credentialBuilder = new GoogleCredential.Builder() 
     .setTransport(HTTP_TRANSPORT).setJsonFactory(JSON_FACTORY) 
     .setClientSecrets(CLIENT_ID, CLIENT_SECRET); 
credentialBuilder.addRefreshListener(new MyCredentialRefreshListener()); 

credential = credentialBuilder.build(); 
credential.setRefreshToken("saved_refresh_token_from_database"); 

try { 
    credential.refreshToken(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 


class MyCredentialRefreshListener implements CredentialRefreshListener { 
    public void onTokenResponse(Credential cr, TokenResponse tr) { 
     System.out.println("Credential was refreshed successfully."); 
    } 

    public void onTokenErrorResponse(Credential cr, TokenErrorResponse tr) { 
     System.out.println(tr); 
    } 
} 

Je reçois ce message:

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad

Demande {"error": "invalid_grant"}

J'utilise le même CLIENT_ID, CLIE NT_SECRET et "refresh token" dans un script php et là j'ai réussi à obtenir le nouveau "token d'accès" en utilisant "refresh token" quand "token d'accès" a expiré. J'ai écrit le code basé sur le javadoc.google-oauth-java-client.

Toute personne ici sait comment modifier le code pour obtenir le nouveau jeton d'accès?

Merci d'avance. MISE À JOUR: le problème était que j'enregistrais dans la base de données le refresh_token sans faire de json_decode dessus et qu'il contenait un "\" qui est considéré comme un caractère échappé dans JSON.

+0

J'ai essayé votre code, et cela a fonctionné pour moi. Je pense que c'était un problème de données/format avec votre jeton d'actualisation. – user1697575

Répondre

2

Il semble que vous ayez trouvé de la documentation périmée. Le lien JavaDoc vous concerne la version 1.8 de la bibliothèque cliente. La version actuelle est 1.12.

Les auteurs de la bibliothèque cliente recommandent d'utiliser GoogleAuthorizationCodeFlow pour gérer vos informations d'identification OAuth. Il prend soin de rafraîchir automatiquement. Si vous suivez ce chemin, le code ressemblera à ceci:

// Create the flow 
AuthorizationCodeFlow authorizationCodeFlow = new GoogleAuthorizationCodeFlow.Builder(
    new UrlFetchTransport(), new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, 
    Collections.singleton(OAUTH_SCOPES)) 
    .setAccessType("offline") 
    .setCredentialStore(new AppEngineCredentialStore()) 
    .build(); 

// User Id: e.g. from session 
Credential credential = authorizationCodeFlow.loadCredential(USER_ID);  

// Make your API call. This example uses the Google+ API 
// If the access token has expired, it will automatically refresh 
Plus plus = new Plus(new UrlFetchTransport(), new JacksonFactory(), credential) 
    .activities().list("me", "public").execute(); 
1

si vous obtenez le statut http 400, et le message "invalid_grant". Je pense que vous devriez vérifier votre instance de HTTP_TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET.