2012-11-06 28 views
5

मैं एक नया "पहुँच टोकन" प्राप्त करने के लिए "टोकन ताज़ा" डेटाबेस में बचाया के आधार पर चाहते हैं।(जावा) गूगल एपीआई विश्लेषिकी - नए "पहुँच टोकन" प्राप्त करने के लिए "ताज़ा टोकन" का उपयोग नहीं कर पा

com.google.api.client.auth.oauth2.TokenResponseException: 400 गलत

अनुरोध

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

मैं यह संदेश प्राप्त:

यहाँ कोड मैंने लिखा है {"त्रुटि": "invalid_grant"}

मैं उसी CLIENT_ID का उपयोग करता हूं, CLIE एक PHP स्क्रिप्ट में NT_SECRET और "रीफ्रेश टोकन" और वहां "एक्सेस टोकन" का उपयोग करके "रीफ्रेश टोकन" का उपयोग करके नया "एक्सेस टोकन" प्राप्त करने में कामयाब रहा।

मैं javadoc.google-oauth-java-client के आधार पर कोड लिखा था।

किसी भी यहाँ व्यक्ति जानता है कि कैसे नई पहुँच टोकन प्राप्त करने के लिए कोड को संशोधित करने?

अग्रिम धन्यवाद।

अपडेट: समस्या यह थी कि मैं डेटाबेस में एक JSON_decode किए बिना refresh_token में सहेज रहा था और इसमें "\" है जिसे JSON में बच निकले चरित्र माना जाता है।

+0

मैंने आपके कोड की कोशिश की, और यह मेरे लिए काम किया। मुझे लगता है कि यह आपके ताज़ा टोकन के साथ एक डेटा/प्रारूप मुद्दा था। – user1697575

उत्तर

2

ऐसा लगता है कि आप तारीख प्रलेखन से बाहर कुछ पाया है हो सकता है। आपके द्वारा लिंक किया गया जावाडॉक क्लाइंट लाइब्रेरी के संस्करण 1.8 के लिए है। वर्तमान संस्करण 1.12 है।

क्लाइंट लाइब्रेरी लेखकों सुझाव है कि आप GoogleAuthorizationCodeFlow का उपयोग अपने OAuth क्रेडेंशियल प्रबंधन करने के लिए। यह स्वचालित रूप से ताज़ा करने का ख्याल रखता है। यदि आप इस पथ का पालन करते हैं, तो कोड इस तरह कुछ दिखाई देगा:

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

यदि आपको http स्थिति 400 मिलती है, और संदेश "invalid_grant" मिलता है। मैं तुम्हें HTTP_TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET के अपने उदाहरण की जाँच करनी चाहिए लगता है।