Подтвердить что ты не робот

Ответ OAuth2 "Недопустимый грант" от сервера

Я прошу моего клиента нажать на этот URL с его авторизованной учетной записью gmail, с которой он создал проект google api.

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 param и выполняю следующий шаг. я успешно представлен следующим ответом

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

Но если клиент сгенерирует код "url" url, тогда я вижу недопустимую ошибку гранта.

Мой клиент находится в Великобритании, и я в другой стране. Кто-нибудь может подтвердить, если это ошибка, потому что клиент генерирует параметр кода в другой стране, и я использую этот код в другой стране?

Спасибо заранее.

4b9b3361

Ответ 1

Вы можете попросить клиента создать код PLUS для последующего токена обновления. Дайте ему доступ к форме выше, где генерируется refresh_token.

Затем вы можете использовать refresh_token для генерации access_tokens.

Надеюсь, что он исправит вашу проблему.

Ответ 2

Меня раздражает ошибка 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 = authorization, вместо этого ему нравится получать 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");