2012-12-18 79 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");