2012-12-18 25 views
11

Tôi yêu cầu khách hàng của tôi truy cập vào URL này bằng tài khoản gmail được ủy quyền của mình mà anh đã tạo dự án google api.Phản hồi "Cấp không hợp lệ" OAuth2 từ máy chủ

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 

và sau đó yêu cầu ông phải cung cấp cho tôi những thông số mã từ URL được chuyển hướng

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

Sau đó, tôi tự gửi biểu mẫu này sau thông tin.

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

và sau đó tôi nhận được lỗi sau

{ 
    "error" : "invalid_grant" 
} 

Khi tôi tạo ra các url đang param bản thân mình và thực hiện các bước tiếp theo. tôi được giới thiệu thành công với phản hồi sau đây

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

Nhưng nếu khách hàng tạo thông số url "mã" thì tôi sẽ thấy lỗi cấp không hợp lệ.

Khách hàng của tôi ở Vương quốc Anh và tôi ở một quốc gia khác. Ai có thể vui lòng xác nhận nếu đó là lỗi vì khách hàng đang tạo mã param ở một quốc gia khác và tôi đang sử dụng mã đó ở một quốc gia khác?

Xin cảm ơn trước.

Trả lời

4

Bạn có thể yêu cầu khách hàng tạo mã PLUS kèm theo mã thông báo làm mới tiếp theo. Cung cấp cho anh ta quyền truy cập vào biểu mẫu ở trên nơi tệp refresh_token được tạo.

Sau đó, bạn có thể sử dụng refresh_token để tạo access_tokens.

Hy vọng nó sẽ khắc phục sự cố của bạn.

+1

cảm ơn đã hoạt động. – shaikh

6

Tôi cảm thấy khó chịu bởi lỗi invalid_grant thay vì thực tế là mã giống nhau đang nhận được mã thông báo truy cập chính xác một số lần.

Câu trả lời của Shaikh đã hướng dẫn tôi sửa chỉ đường.

Trước hết chúng tôi cố gắng để có được mã truy cập từ:

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

tài là hướng đến "Allow Permission" màn hình và sau đó ứng dụng của chúng tôi nhận được mã truy cập.

Sử dụng mã truy cập chúng tôi cố gắng để có được quyền truy cập token từ:

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

Trong nỗ lực đầu tiên nó sẽ trở lại chúng tôi access_token với grant_type = authorization_code, nhưng một khi access_token đã được cung cấp cho chúng tôi, nó không còn mong muốn nhận được grant_type = uỷ quyền một lần nữa, thay vào đó nó thích để nhận grant_type = refresh_token

Đối với đồng các nhà phát triển android mã như sau:

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