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

Предотвращение автоматической регистрации при использовании входа в Google+

Я собираюсь интегрировать Google+ с моим сайтом, который также позволяет пользователям войти в систему с помощью Twitter и Facebook. Таким образом, на странице сайта есть 3 кнопки, по одной для каждой из сервисов.

Проблема, которая возникает у меня, следующая:

  • пользователь переходит на страницу входа.
  • пользователь успешно подписывается на G +
  • пользователь подписывает мой сайт (но учетная запись все еще связана с G +, выключение сайта не отключает учетную запись G +).
  • пользователь снова посещает страницу входа.
  • на этом этапе выполняется вход в систему с помощью кнопки G + и автоматически подписывает пользователя на учетную запись, связанную с G +, без необходимости нажатия кнопки

Проблема в том, что при переходе на страницу с подписью я хочу, чтобы у пользователя была возможность входа в систему с другой службой, а не с автоматической подпиской с G+. Если пользователь хочет войти в систему с помощью G +, то они могут сделать это, нажав кнопку - пользователь будет автоматически подписан.

Можно ли предотвратить включение этого автоматического нажатия на кнопку рендеринга? Я могу имитировать его, используя data-approvalprompt="force" как атрибут кнопки, но я не думаю, что это идеальное решение (пользователь должен пройти процесс подтверждения, который я бы идеально хотел бы предотвратить)

4b9b3361

Ответ 1

Обновление

Лучшим способом предотвращения автоматической регистрации является использование метода API gapi.auth2.getAuthInstance().signOut(), который предотвратит автоматический вход на ваш сайт после его вызова. Демо здесь.

В демонстрации пользователь выйдет из игры, когда покинет страницу, как показано в следующем коде:

window.onbeforeunload = function(e){
  gapi.auth2.getAuthInstance().signOut();
};

Теперь, когда пользователь выходит из сайта (например, закрывает окно, перемещается в сторону), они будут выведены из системы, и кнопка входа в систему не активирует вход в систему, пока пользователь не нажмет на нее.

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

Оригинальная публикация

Во-первых, вы не должны использовать data-confirmprompt = "force", так как это приведет к выдаче ваших авторизованных субтокенов вашему приложению/клиенту и предназначено для использования в сценариях, когда пользователь должен быть повторно авторизирован после того, как учетные данные были потеряны на стороне сервера.

Во-вторых, вы, вероятно, не хотите, чтобы поведение, в котором пользователю нужно было щелкнуть, чтобы войти в него, потому что они уже "вошли" в свою учетную запись Google, и может возникнуть проблема с необходимостью входа в систему (или запускать подписи, in) снова, отдельно, для вашего сайта.

Если вы действительно хотели это сделать, вы бы выполнили явный рендер для кнопки signin, но не сделали бы вызов to gapi.signin.render, как описано в Документация по подписке Google+, пока вы не узнаете, что пользователь не будет автоматически получать вход.

В следующем коде показано, как включить явный рендер кнопки входа:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
{"parsetags": "explicit"}
</script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<head>
<script type="text/javascript">
var token = "";
function onSigninCallbackVanilla(authResponse){
   // in a typical flow, you show disconnect here and hide the sign-in button
}

Следующий код показывает, как явно отображать кнопку:

  <span id="signinButton">
    <button id = "shim" onclick="gapi.signin.go(); $('#shim').hide();">Show the button</button>
    <span
      class="g-signin"
      data-callback="onSigninCallbackVanilla"
      data-clientid="YOUR_CLIENT_ID"
      data-cookiepolicy="single_host_origin"
      data-requestvisibleactions="http://schemas.google.com/AddActivity"
      data-scope="https://www.googleapis.com/auth/plus.login">

    </span>
  </span>  

Как вы сообщаете, что пользователь вышел из вашего сайта, вероятно, будет отличаться от сайта к сайту, но одним из подходов может быть установка файла cookie с указанием состояния "подписанного" для пользователя, а затем использование этого как триггер для блокировки явной загрузки. Поведение становится немного сложнее, когда пользователь посещает ваш сайт и отключает куки или использует отдельный, подписанный браузер. Чтобы решить эту проблему, вы можете сделать что-то сложное, например, запрашивать состояние пользователя с вашего сервера через XHR при обратном вызове входа и притворяться, что не знаете, что пользователь подписан в Google +.

Ответ 2

Просто проверьте g-auth-window в функции обратного вызова:

    function google_sign_callback(authResult){
        if(authResult['g-oauth-window']){

        }else if(authResult['error']) {

        }
    }

Ответ 3

У меня была эта проблема и я использовал auth2.disconnect()

function onSignIn(googleUser) {
    var profile = googleUser.getBasicProfile();
    var auth2 = gapi.auth2.getAuthInstance();
    auth2.disconnect();

    //do other stuff
}

Изменить: вам нужно сохранить токен перед отключением, потому что в некоторых случаях id_token станет нулевым после отключения:

function onSignIn(googleUser) {
    var profile = googleUser.getBasicProfile();
    var idToken=profile.id_token;
    googleUser.disconnect()

    //use idToken for server side verification
}

Если я прав, у вас есть свой собственный механизм входа для вашего сайта, и вам просто нужно войти в Google, чтобы зарегистрировать пользователя на подтвержденном электронном письме. в этом случае вы можете легко отключиться после получения информации о профиле. В следующий раз, когда вы загрузите страницу, вы увидите кнопку "войти" вместо кнопки "подписаться".

Ответ 4

Наше решение AngularJS было:

$scope.$on('event:google-plus-signin-success', function (event, authResult) {
                if( authResult.status.method !== "AUTO"){
                    onGoogleLogIn(authResult[settings.configKeys.googleResponseToken]);
                }
            });

Ответ 5

К сожалению, вызов gapi.auth.signOut() заставил приложение снова войти в систему, когда я запрашиваю данные пользователя (он не является постоянным)

Таким образом, решение, предложенное @class, должно аннулировать токен:

  $.ajax({
    type: 'GET',
    url: 'https://accounts.google.com/o/oauth2/revoke?token=' +
        gapi.auth.getToken().access_token,
    async: false,
    contentType: 'application/json',
    dataType: 'jsonp',
    success: function(result) {
      console.log('revoke response: ' + result);
      $('#authOps').hide();
      $('#profile').empty();
      $('#visiblePeople').empty();
      $('#authResult').empty();
      $('#gConnect').show();
    },
    error: function(e) {
      console.log(e);
    }
  });

Ответ 6

У меня тоже такая же проблема, как я исправил его. Я не уверен, что это стандартный способ сделать это, но все равно он отлично работает со мной...

добавьте этот Google JS из разработчика Google

<script src="https://apis.google.com/js/platform.js" async defer></script>
<script>

function onSuccessG(googleUser) {
        var profile = googleUser.getBasicProfile();
        console.log('ID: ' + profile.getId()); // Do not send to your backend! Use an ID token instead.
        console.log('Name: ' + profile.getName());
        console.log('Image URL: ' + profile.getImageUrl());
        console.log('Email: ' + profile.getEmail());
}
function onFailureG(error) {
    console.log(error);
}
function renderGmail() {

  gapi.signin2.render('my-signin2', {
    'scope': 'https://www.googleapis.com/auth/plus.login',
    'width': 0,
    'height': 0,
    'longtitle': true,
    'theme': 'dark',
    'onsuccess': onSuccessG,
    'onfailure': onFailureG
  });
}

Теперь добавьте ссылку html и onClick вызовите эту функцию renderGmail().

<a href="javascript:void(0)" onclick="renderGmail();"> SignUp with Gmail</a>

Надеюсь, это сработает...

Ответ 7

Я использую https://developers.google.com/identity/sign-in/web/build-button, чтобы создать кнопку входа для моего веб-приложения, которая дает пользователю возможность войти в систему через Facebook или Google. Этот код довольно легко получить Id_token. Однако он также включал автоматическое подписание пользователя, если пользователь уже выполнил вход.

Таким образом, добавление следующего фрагмента в начале script помогло мне контролировать процедуру регистрации.

    window.onbeforeunload = function(e){
      gapi.auth2.getAuthInstance().signOut();
    };

Спасибо!

Ответ 8

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

В итоге я использовал пользовательскую интеграцию, которая не пыталась автоподписать (также разрешила мне менять внешний вид в одно и то же время )