Дополнительное разрешение при использовании кнопки входа в Google

Я использую кнопку входа Google на своем веб-сайте. Я могу авторизовать пользователей и получить информацию о профиле пользователя.

Я следил за этим. Интеграция входа в Google в ваше веб-приложение.

<div id="my-signin2" ></div>

gapi.signin2.render('my-signin2', {
            'scope': 'profile email',
            'width': 240,
            'height': 50,
            'longtitle': true,
            'theme': 'light',
            'onsuccess': this.onSuccess,
            'onfailure': this.onFailure
        });

      onSuccess(googleUser) {
               var id_token = googleUser.getAuthResponse().id_token;
                var name = googleUser.getBasicProfile().getName());
                var email = googleUser.getBasicProfile().getEmail());
                var imageUrl = googleUser.getBasicProfile().getImageUrl());

      }
      onFailure(error) {
      }

Теперь мне нужно прочитать контакты пользователей, пока он авторизуется с помощью Google.

Поэтому для получения контактов я добавил область

https://www.googleapis.com/auth/contacts.readonly

        gapi.signin2.render('my-signin2', {
            'scope': 'profile email https://www.googleapis.com/auth/contacts.readonly',
            'width': 240,
            'height': 50,
            'longtitle': true,
            'theme': 'light',
            'onsuccess': this.onSuccess,
            'onfailure': this.onFailure
        });

Все работает нормально. После того, как пользователь авторизуется с помощью gmail, он отображает экран разрешений для пользователя и запрашивает разрешение.

Но когда пользователь отказывает в разрешении, он даже не регистрирует пользователя. Я хочу, чтобы пользователь вошел в систему, даже если он отрицает, все нормально, если я не получу его контакты.

Я читал о запросе дополнительных областей.

        var options = new gapi.auth2.SigninOptionsBuilder(
                {'scope': 'https://www.googleapis.com/auth/contacts.readonly'});

        googleUser = auth2.currentUser.get();
        googleUser.grant(options).then(
            function(success){
              console.log(JSON.stringify({message: "success", value: success}));
            },
            function(fail){
              alert(JSON.stringify({message: "fail", value: fail}));
            });

Когда я использую это после в onSuccess(после того, как пользователь авторизует электронную почту), он всегда переходит к методу сбоя. Ошибка выдачи " popup_closed_by_user "

1 ответ

Согласно обсуждению в этой теме

Нашел решение.

Создал еще одну кнопку для запроса дополнительной области и вызвал метод предоставления на клике кнопки.

Если вы установите такие параметры, это не работает

var options = new gapi.auth2.SigninOptionsBuilder(
            {'scope': 'https://www.googleapis.com/auth/contacts.readonly'});

Для получения областей вы должны использовать методы

let googleUser = auth2.currentUser.get();

var options = new gapi.auth2.SigninOptionsBuilder();
options.setScope('https://www.googleapis.com/auth/contacts.readonly');


googleUser.grant(options).then(
        function(success){
          console.log(JSON.stringify({message: "success", value: success}));
        },
        function(fail){
          alert(JSON.stringify({message: "fail", value: fail}));
});
Другие вопросы по тегам