redirect_uri_mismatch с регистрацией Google для серверных приложений

У меня проблема со входом в Google. Я следую инструкциям по Входу в Google для сервера- сторонние приложения После всего этого шага у меня есть этот html-файл, который запускается на сервере:

<!DOCTYPE html>
<html itemscope itemtype="http://schema.org/Article">
    <head>
        <link rel="stylesheet" href="theme.css">
        <!-- BEGIN Pre-requisites -->
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
        <!-- END Pre-requisites -->
        <script>
            function start() {
                gapi.load('auth2', function() {
                    auth2 = gapi.auth2.init({
                        client_id: 'CLIENT_ID'
                    });
                });
            }
        </script>
    </head>
    <body>
        <button id="googleBtn">Connect</button>
        <script>
            $('#googleBtn').click(function() {
                auth2.grantOfflineAccess().then(googleCallback);
            });
        </script>
        <script>
            function googleCallback(authResult) {
                if (authResult['code']) {
                    console.log(authResult);
                } else {
                    console.log(authResult);
                }
            }
        </script>
    </body>
</html>

Эта первая часть работает отлично (я думаю), когда я нажимаю кнопку, появляется всплывающее окно, я выбираю учетную запись и получаю код. Итак, теперь я хочу получить электронную почту и профиль, поэтому я делаю этот запрос в nodejs, чтобы обменять код на токен доступа.

var form = {
    code: 'XXXXXXXXXXXX',
    client_id: 'CLIENT_ID,
    client_secret: 'CLIENT',
    grant_type:'authorization_code'
};

var formData = querystring.stringify(form);
var contentLength = formData.length;

request({
    headers: {
      'Content-Length': contentLength,
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    uri: 'https://www.googleapis.com/oauth2/v4/token',
    body: formData,
    method: 'POST'
  }, function (err, rep, body) {
    console.log(err);
    console.log(rep.statusCode);
    console.log(body);
  });

Но в ответ у меня это

{
 "error": "redirect_uri_mismatch",
 "error_description": "Bad Request"
}

И я не понимаю почему, потому что я не использую redirect_uri в основном запросе в html файле. Я пробовал некоторые случаи, такие как добавление redirect_uri в API консоли и в запросе, но у меня тот же результат...

Вы можете помочь мне ?


person Thefirstalpha    schedule 14.11.2017    source источник
comment
какие-либо обновления по этому поводу?   -  person ngLover    schedule 24.10.2018
comment
не совсем, я изменил этот метод (developers.google.com /identity/sign-in/web/backend-auth), потому что я не нашел решения этой проблемы   -  person Thefirstalpha    schedule 24.10.2018


Ответы (2)


Со стороны клиента auth2.grantOfflineAccess процесс, чтобы получить accessToken на сервере, вы должны передать redirect_uri=postmessage в параметрах запроса.

Из вашего примера:

var form = {
  code: 'XXXXXXXXXXXX',
  client_id: 'CLIENT_ID,
  client_secret: 'CLIENT',
  grant_type:'authorization_code',
  redirect_uri: 'postmessage' // the line to add
};
person Doubidou    schedule 19.06.2019
comment
Спасибо!!! Просто любопытно, как вы узнали, что redirect_uri должно быть почтовым сообщением? - person Chris; 15.04.2020
comment
Я не помню, извините .. после долгих поисков, реверса и т. Д. ;) - person Doubidou; 15.04.2020
comment
Вы спасли мой срок, спасибо! Я все еще ищу документ в Google. Даже в руководстве по работе с сервером об этом не говорится! developers.google.com/identity/sign-in/web/server-side-flow - person maxime; 18.07.2020

Вам необходимо указать URL-адрес обратного вызова для Google через console.developer.google.com.

Итак, вам нужно выполнить следующие шаги для определения URL-адреса обратного вызова:

  1. Перейдите на console.developer.google.com.
  2. Выберите свой проект.
  3. Нажмите «Учетные данные» в меню слева.
  4. Щелкните свой клиент в списке «Идентификаторы клиентов OAuth 2.0».
  5. Добавьте URL-адрес обратного вызова в список «Авторизованные URI перенаправления».

И сделано.

person endrcn    schedule 14.11.2017
comment
Я уже делал это раньше, но, наконец, я не использую этот метод (Вход через Google для веб-сайтов), но спасибо - person Thefirstalpha; 16.11.2017
comment
это исправлено? у меня такая же проблема - person ngLover; 09.10.2018
comment
У меня такая же проблема. Я зарегистрировал редиректы в google. Было ли решение? - person conterio; 18.04.2019