недействительный ответ от обмена кодом авторизации - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь аутентифицировать свое приложение в API контактов Google. Я прошел первый шаг в потоке Oauth2 и получил код авторизации. Я пытаюсь обменять этот код на токен доступа и обновить токен, но при попытке получить токен с googleapis.com/oauth2/v4/token получите с

ответ: «invalid_grant» «Неверный запрос» Ошибка 400.

Мой код

try
        {
            Map<String,Object> params = new LinkedHashMap<>();
            params.put("grant_type","authorization_code");
            params.put("code", authCode);
            params.put("client_id",CLIENTE_ID);
            params.put("client_secret",CLIENTE_ID_SECRETO);
            params.put("redirect_uri","http://localhost:8080/conob/api2/contatos/insert");

            StringBuilder postData = new StringBuilder();
            for(Map.Entry<String,Object> param : params.entrySet())
            {
                if(postData.length() != 0){
                    postData.append('&');
                }

                postData.append(URLEncoder.encode(param.getKey(),"UTF-8"));
                postData.append('=');
                postData.append(URLEncoder.encode(String.valueOf(param.getValue()),"UTF-8"));
            }

            byte[] postDataBytes = postData.toString().getBytes("UTF-8");

            URL url = new URL("https://www.googleapis.com/oauth2/v4/token");
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            con.setRequestProperty("charset", "utf-8");
            con.setRequestProperty("Content-Length", postData.toString().length() + "");
            con.getOutputStream().write(postDataBytes);


            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(con.getInputStream()));

                StringBuffer buffer = new StringBuffer();

                for (String line = reader.readLine(); line != null; line = reader.readLine()){
                    buffer.append(line);
                }

                JSONObject json = new JSONObject(buffer.toString());
                String accessToken = json.getString("access_token");

                return accessToken;
            } catch (Exception e) {
                reader = new BufferedReader(new InputStreamReader(con.getErrorStream()));

                StringBuffer buffer = new StringBuffer();

                for (String line = reader.readLine(); line != null; line = reader.readLine()){
                    buffer.append(line);
                }

                System.out.println(buffer.toString());
                System.out.println(e.toString());
            }

        }
        catch (Exception ex)
        {
            ex.printStackTrace(); 
        }
        return null;

Параметры вывода:

grant_type = authorization_code & код = AUTHORIZATION_CODE & client_id = CLIENTE_ID & client_secret = CLIENTE_SECRET & redirect_uri = HTTP% 3A% 2F% 2Flocalhost% 3A8080% 2Fconob% 2Fapi2% 2Fcontatos% 2Finsert

Я много часов ищу на многих форумах, но не могу найти решение своей проблемы.

Как правило, моему приложению необходимо вставить новый контакт в учетные записи Google в корпоративной сети.

Мой вопрос, что ответ "invalid_grant"?

Хороший код и спасибо с тех пор;

1 Ответ

0 голосов
/ 31 октября 2018

В спецификации OAuth2 "invalid_grant" является своего рода универсальным ответом на все сообщения об ошибках, связанные с недействительными / просроченными / отозванными токенами (токен авторизации или обновления).

общие причины

  1. Пользователь активно отозвал доступ к нашему приложению
  2. Пользователь сбросил / восстановил свой пароль Google В декабре 2015 года Google изменил свое поведение по умолчанию, чтобы при сбросе пароля для пользователей не из Служб Google автоматически отменялись все маркеры обновления приложений пользователя. Это не верно для всех контактов apis, не является одним из них, но я подумал, что все равно заметил бы это.

Помимо этого, существует множество других потенциальных причин, которые могут вызвать ошибку:

  1. Часы / время сервера не синхронизированы
  2. Не авторизован для доступа в автономном режиме
  3. Задушено Google
  4. Использование маркеров обновления с истекшим сроком действия
  5. с использованием кода авторизации с истекшим сроком действия.
  6. Пользователь неактивен 6 месяцев
  7. Неверный или недействительный токен обновления
  8. Использовать электронную почту работника службы вместо идентификатора клиента
  9. Слишком много токенов доступа за короткое время
  10. Клиентский SDK может быть устаревшим

Конечная точка

Я понимаю, что в документе обнаружения написано googleapis.com/oauth2/v4/token, но по какой-то причине эта конечная точка не всегда работает, попробуйте использовать accounts.google.com/o/oauth2/token

redirect_uri_mismatch

Означает, что URI перенаправления, отправляемый с вашим запросом http://localhost:8080/conob/api2/contatos/insert, не является одним из тех, которые вы добавили в консоль разработчика Google. Вам нужно вернуться в консоль разработчика Google и добавить этот URI перенаправления.

Обратите внимание, что вы можете рассмотреть возможность работы с API Google People. Это гораздо более простой API, чем со старым API Google Contacts.

...