2012-11-06 18 views
5

Chcę uzyskać nowy "token dostępu" w oparciu o "odświeżony token" zapisany w bazie danych.(JAVA) Google API analytics - nie można uzyskać nowego "tokena dostępu" za pomocą "odświeżania tokena"

Oto kod pisałem:

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); 
    } 
} 

otrzymuję komunikat:

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

Zamówienie {"błąd": "invalid_grant"}

Używam tego samego CLIENT_ID, CLIE NT_SECRET i "odśwież tokena" w skrypcie php i tam udało mi się zdobyć nowy "token dostępu" za pomocą "odświeżającego tokena", gdy wygasł "token dostępu".

Napisałem kod na podstawie javadoc.google-oauth-java-client.

Ktoś wie, jak zmodyfikować kod, aby uzyskać nowy token dostępu?

Z góry dziękuję.

AKTUALIZACJA: Problem polegał na tym, że zapisywałem w bazie danych refresh_token bez wykonywania json_decode na nim i zawierało "\", co jest uważane za znak zbiegunowy w JSON.

+0

Wypróbowałem twój kod i zadziałało to dla mnie. Myślę, że to był problem z formatem danych/formatu z odświeżającym tokenem. – user1697575

Odpowiedz

2

Wygląda na to, że znalazłeś nieaktualną dokumentację. Łącze JavaDoc you jest dla wersji 1.8 biblioteki klienta. Obecna wersja to 1.12.

Autorzy biblioteki klientów zalecają stosowanie GoogleAuthorizationCodeFlow do zarządzania danymi uwierzytelniającymi OAuth. Dba o odświeżanie automatycznie. Jeśli podążysz tą ścieżką, kod będzie wyglądał mniej więcej tak:

// 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

jeśli otrzymasz status HTTP 400 oraz wiadomość "invalid_grant". Myślę, że powinieneś sprawdzić swoją instancję: HTTP_TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET.

Powiązane problemy