2012-12-18 25 views
11

Müşterimden, google api projesini oluşturduğu yetkili gmail hesabıyla bu URL'ye isabet etmesini rica ediyorum. OAuth2 Sunucudan "Geçersiz Hibe" yanıtı

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 

ve sonra Sonra kendimi bilgi aşağıdaki bu formu göndermek yönlendirilen URL'ye

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

dan bana kod parametresini sağlamak için ona sorun. i kod url kendim Ayarlanacak ve bir sonraki adımı gerçekleştirmek oluşturduğunuzda

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

ve sonra ben aşağıdaki hatayı

{ 
    "error" : "invalid_grant" 
} 

olsun. i başarıyla yanıt aşağıdaki

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

ile sunulan am Fakat istemci url param "kod" oluşturursak o zaman ben geçersiz hibe hatası görebilirsiniz.

Müvekkilim İngiltere'de ve başka bir ülkedeyim. Hata olup olmadığını lütfen teyit edebilirsiniz, çünkü müşteri başka bir ülkede kod paramını üretiyor ve bu kodu başka bir ülkede kullanıyor muyum?

Şimdiden teşekkürler.

cevap

4

İstemciden kodu oluşturmasını isteyebilirsiniz. Ona, refresh_token öğesinin oluşturulduğu yukarıdaki forma erişim verin.

Sonra access_tokens oluşturmak için refresh_token kullanabilirsiniz.

Sorununuzu düzeltir umuyoruz.

+1

teşekkürler çalıştı. – shaikh

6

Aynı kodun bazı zamanlar doğru erişim belirtecini alması yerine, invalid_grant hatası nedeniyle rahatsız oldum.

Shaikh'ın cevabı yönünü düzeltmemi sağladı.

biz gelen erişim kodunu elde etmeye çalışmak her şeyden

İlk:

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

Kullanıcı ekranını "İzin ver" yönlendirilmiş ve bizim app giriş kodu temin edilir. Biz gelen erişim belirteci elde etmeye çalışmak olduğunu erişim kodunu kullanarak

: o grant_type = authorization_code bize ACCESS_TOKEN dönecektir

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

ilk girişimde, ama ACCESS_TOKEN bize sağlanan edildikten sonra, hiç uzun grant_type almayı beklediği = yetkilendirme yine bunun yerine kod aşağıdaki gibidir dost android geliştiriciler için

refresh_token = grant_type almayı sever:

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"); 
İlgili konular