2012-12-18 12 views
11

मैं अपने क्लाइंट से अपने अधिकृत जीमेल खाते के साथ इस यूआरएल पर हिट करने के लिए कहता हूं जिसके साथ उसने Google एपीआई प्रोजेक्ट बनाया है।सर्वर से 0A392 "अमान्य अनुदान" प्रतिक्रिया

https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=http://www.XXXXXXXX.com/oauth2callback&client_id=XXXXXX.apps.googleusercontent.com&state=profile&approval_prompt=force 

और उसके बाद उसे मुझे रीडायरेक्ट URL

http://www.XXXXXXXX.com/oauth2callback?code=4/jUxc2MdX0xmF-b4_I6v2SLMQMuxO.cvQLVEpcJMUXOl05ti8ZT3ZvsT9ddwI 

से कोड पैरामीटर प्रदान करने के लिए तो मैं अपने आप की जानकारी निम्नलिखित के साथ इस फार्म पोस्ट पूछना।

<form action="https://accounts.google.com/o/oauth2/token" method="post" > 

<input type="hidden" name="grant_type" value="authorization_code" > 
<input type="text" name="code" value="**is the one i recieved from previous step**"> 
<input type="hidden" name="client_id" value="XXXXXXX.apps.googleusercontent.com" > 
<input type="hidden" name="client_secret" value="XXXXXXXXXXXX" > 
<input type="hidden" name="redirect_uri" value="http://www.XXXXXX.com/oauth2callback" > 
<input type="submit" value="Submit"> 

</form> 

और फिर मैं निम्न त्रुटि

{ 
    "error" : "invalid_grant" 
} 

मिल जब मैं उत्पन्न कोड यूआरएल अपने आप को परम और अगले कदम प्रदर्शन करते हैं। मैं सफलतापूर्वक प्रतिक्रिया के बाद

{ 
 "access_token" : "XXXXXXStBkRnGyZ2mUYOLgls7QVBxOg82XhBCFo8UIT5gM", 
 "token_type" : "Bearer", 
 "expires_in" : 3600, 
 "refresh_token" : "XXXXXX3SEBX7F2cfrHcqJEa3KoAHYeXES6nmho" 
} 

के साथ प्रस्तुत कर रहा हूँ लेकिन अगर ग्राहक यूआरएल परम "कोड" उत्पन्न तो मैं अवैध अनुदान त्रुटि देखते हैं।

मेरा ग्राहक ब्रिटेन में है और मैं दूसरे देश में हूं। क्या कोई यह पुष्टि कर सकता है कि क्या यह त्रुटि है क्योंकि क्लाइंट दूसरे देश में कोड पैरामेट उत्पन्न कर रहा है और मैं उस कोड का उपयोग दूसरे देश में कर रहा हूं?

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

उत्तर

4

आप क्लाइंट से बाद में ताज़ा टोकन कोड उत्पन्न करने के लिए कह सकते हैं। उसे ऊपर दिए गए फॉर्म तक पहुंच दें जहां refresh_token उत्पन्न होता है।

फिर आप access_tokens उत्पन्न करने के लिए refresh_token का उपयोग कर सकते हैं।

आशा है कि यह आपकी समस्या को हल करे।

+1

धन्यवाद जो काम करता है। – shaikh

6

मुझे इस तथ्य के बजाय अवैध_ग्रैंट त्रुटि से नाराज हो गया है कि एक ही कोड मुझे कुछ बार सही पहुंच टोकन प्राप्त कर रहा है।

शेख के जवाब ने मुझे दिशा को सही करने के लिए निर्देशित किया है।

सब हम से एक्सेस कोड प्राप्त करने की कोशिश की

पहले:

https://accounts.google.com/o/oauth2/auth

उपयोगकर्ता स्क्रीन "अनुमति की अनुमति दें" को निर्देश दिया जाता है और फिर हमारे एप्लिकेशन का उपयोग कोड प्राप्त करते हैं।

कि एक्सेस कोड पहुंच टोकन प्राप्त करने से कोशिश का उपयोग करना:

https://accounts.google.com/o/oauth2/token

पहले ही प्रयास में यह grant_type = authorization_code के साथ हमें ACCESS_TOKEN वापस आ जाएगी, लेकिन एक बार ACCESS_TOKEN हमें प्रदान की गई है, यह कोई अब grant_type प्राप्त करने की अपेक्षा = प्राधिकरण फिर, बजाय इसे grant_type प्राप्त करने के लिए इस प्रकार कोड है पसंद करती = refresh_token

साथी एंड्रॉयड डेवलपर के लिए:

String accessToken = null, refreshToken = null; 
HttpPost httppost = new HttpPost(https://accounts.google.com/o/oauth2/token); 
HttpParams myParams = new BasicHttpParams(); 
httppost.setHeader("Content-type", "application/x-www-form-urlencoded"); 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4); 
nameValuePairs.add(new BasicNameValuePair("client_id", BLOGGER_CLIENT_ID)); 
SharedPreferences prefs = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); 
String bloggerAccessToken = prefs.getString(PREFERENCES_KEY_BLOGGER_ACCESS_TOKEN, null); 

if(bloggerAccessToken != null && bloggerAccessToken.length() > 0){ 
    nameValuePairs.add(new BasicNameValuePair("refresh_token", prefs.getString(PREFERENCES_KEY_BLOGGER_REFRESH_TOKEN, null))); 
    nameValuePairs.add(new BasicNameValuePair("grant_type", "refresh_token")); 
} else{ 
    nameValuePairs.add(new BasicNameValuePair("code", prefs.getString(PREFERENCES_KEY_BLOGGER_ACCESS_CODE, null))); 
    nameValuePairs.add(new BasicNameValuePair("grant_type", "authorization_code")); 
    nameValuePairs.add(new BasicNameValuePair("redirect_uri", "http://localhost")); 
} 

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
HttpClient httpClient = new DefaultHttpClient(myParams); 
response = httpClient.execute(httppost); 

String returnedJsonStr = EntityUtils.toString(response.getEntity()); 
JSONObject jsonObject = new JSONObject(returnedJsonStr); 
accessToken = jsonObject.getString("access_token"); 
if(jsonObject.has("refresh_token")) 
    refreshToken = jsonObject.getString("refresh_token"); 
संबंधित मुद्दे