2012-12-18 77 views
11

我要求我的客戶使用其創建Google API項目的授權gmail帳戶訪問此URL。來自服務器的OAuth2「無效的授權」響應

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

當我生成的代碼URL帕拉姆自己和執行下一步。我很成功帶有以下響應

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

但是,如果客戶端生成URL參數「代碼」,然後我看到無效授予錯誤。

我的客戶在英國,我在另一個國家。任何人都可以確認是否錯誤,因爲客戶端在另一個國家生成代碼參數,我在另一個國家使用該代碼?

在此先感謝。

回答

4

您可能會要求客戶端自己生成代碼PLUS後續刷新標記。讓他訪問上面生成refresh_token的表單。

然後,您可以使用refresh_token生成access_tokens。

希望它能解決您的問題。

+1

謝謝你的工作。 – shaikh

6

我被invalid_grant錯誤困擾了,而不是相同的代碼讓我正確的訪問令牌有些事實。

謝赫的回答引導了我正確的方向。

所有我們試圖從獲得訪問代碼的第一:

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

用戶被定向到「允許權限」屏幕,然後我們的應用程序獲得訪問代碼。

使用我們嘗試獲得訪問令牌從接入代碼:

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

在第一次嘗試將返回我們的access_token與grant_type = authorization_code,但一旦的access_token已經提供給我們,這不再指望收到grant_type =授權一遍,而是喜歡收到grant_type = refresh_token

同胞Android開發人員的代碼如下:

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