Invalid_grant ответ от обмена кодом авторизации

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

response : "invalid_grant" "Bad request" Error 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&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"?

Хороший код и спасибо с настоящего момента;

Что в этом случае будет ответом "Плохой запрос", извините: /

Nicolas Santos 31.10.2018 13:59

По любой причине, по которой вы не используете клиентская библиотека google api java

DaImTo 31.10.2018 14:00

попробуйте выложить в accounts.google.com/o/oauth2/token, а не в googleapis.com/oauth2/v4/toke

DaImTo 31.10.2018 14:03

@bogl вопрос и проблема были для меня совершенно ясны. Однако, поскольку у вас возникли проблемы с пониманием этого, я отредактировал его вопрос. Теперь стало понятнее?

DaImTo 31.10.2018 14:12

Добро пожаловать в stackoverflow, Николас! Теперь вопрос стал более читаемым, большое спасибо!

bogl 31.10.2018 14:15
3
5
2 055
1

Ответы 1

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

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

  1. Пользователь активно отозвал доступ к нашему приложению
  2. Пользователь сбросил / восстановил свой пароль Google В декабре 2015 года Google изменил свое поведение по умолчанию, так что при сбросе пароля для пользователей, не использующих Google Apps, автоматически отменяются все токены обновления приложений пользователя. Это не верно для всех контактов 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, с ним гораздо проще работать, чем со старым api контактов Google.

Dalm Спасибо за помощь. Я попытался изменить POST для accounts.google.com/o/oauth2/token, и теперь ошибка: «error»: «redirect_uri_mismatch», «error_description»: «Неверный запрос» Я использую свою учетную запись для тестирования api, поэтому время сервера / часов правильное, на экране согласия acess_type отключен, код авторизации - это ответ моего первого перенаправления пользователя .

Nicolas Santos 31.10.2018 14:20

Проверьте мои изменения на предмет решения для redirect_uri_missmatch

DaImTo 31.10.2018 14:24

В любом случае находится в консоли Dev в Google Cloud, я действительно рассматриваю возможность использовать People API, если у кого-то есть предложения по разрешению де Uri_missmatch, я благодарю.

Nicolas Santos 31.10.2018 14:32

Способ устранения несоответствия перенаправления - это добавить uri перенаправления клиенту console.developers.google.com. Это единственный способ. Вы просто зайдите, отредактируйте своего клиента, добавьте правильный uri перенаправления, и он будет работать

DaImTo 31.10.2018 14:50

См. Ниже предоставленный uri перенаправления моего Cliente_Secret.json: ["http://localhost:8080/conob/api2/contatos/token", "http://localhost:8080/conob/api2/contatos/insert", "http://localhost:8080/conob/api2/contatos/insert/", "http://localhost:8080/conob/api2/contatos/token/", "http://127.0.0.1:8080/conob/api2/contatos/insert", "http://127.0.0.1:8080/conob/api2/contatos/insert/"], "javascript_origins":["http://localhost:8080"]}}

Nicolas Santos 31.10.2018 17:56

добавление его в секретный код клиента json не поможет, его необходимо добавить на сервер идентификации Google, то, что вы указали, также является http, вы отправляете https. он должен точно соответствовать тому, что зарегистрировано в консоли разработчика под URI перенаправления.

DaImTo 31.10.2018 18:55

Распечатка моей консоли: Ссылка на Диск

Nicolas Santos 31.10.2018 19:03

Другие вопросы по теме