使用Google+登录时阻止自动登录

时间:2013-03-18 18:48:11

标签: google-plus

我正在整合Google+登录与我的网站,这也让用户可以通过Twitter和Facebook登录。因此,该网站的登录页面有3个按钮,每个按钮一个。

我遇到的问题出现在以下情况中:

  • 用户转到登录页面
  • 用户使用G +
  • 成功登录
  • 用户退出我的网站(但该帐户仍与G +相关联,退出网站时不会断开G +帐户)
  • 用户再次访问登录页面
  • 在此阶段,使用G +按钮登录并自动将用户签入与G +关联的帐户,而无需用户点击按钮

问题是,在重新访问登录页面时,我希望用户可以选择使用其他服务登录,而不是使用G +自动登录。如果用户想要使用G +登录,则可以通过单击按钮进行登录 - 然后用户将自动登录。

是否可以阻止此按钮渲染上的自动登录?我可以使用data-approvalprompt="force"作为按钮上的属性来模拟它,但我不认为这是一个理想的解决方案(用户必须经过确认过程,我理想的是希望防止)

10 个答案:

答案 0 :(得分:29)

<强>更新

阻止自动登录的最佳支持方式是使用API​​方法gapi.auth2.getAuthInstance().signOut(),这将阻止在您的网站被调用后自动登录。 Demo here

在演示中,用户在离开页面时退出,如下面的代码所示:

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

现在,只要用户退出网站(例如关闭窗口,导航离开),他们就会退出,并且登录按钮不会触发登录,直到用户点击它。

我不建议您在自己的实现中执行此操作,而是允许用户在不再希望登录时明确退出。另请注意,我的示例是演示,您可能不会想要在用户离开您的网站时自动退出用户。

原帖

首先,您不应该使用data-approvalprompt =“force”,因为这将导致向您的应用程序/客户端发出额外的授权子代码,并且旨在用于需要在凭据具有资格后重新授权的情况丢失了服务器端。

其次,您可能不希望出现用户需要点击登录的行为,因为他们已经“登录”了他们的Google帐户,而且可能会因为需要登录(或触发签名)而感到困惑in)再次,分别为您的网站。

如果您真的想要这样做,您将对登录按钮执行显式渲染,但不会按照Google+ sign-in documentation中的说明调用gapi.signin.render,直到您意识到用户将自动登录。

以下代码显示了如何启用登录按钮的显式呈现:

<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,指示用户的“已注销”状态,然后使用此状态作为阻止显式加载的触发器。当用户访问您的网站并禁用cookie或使用单独的登录浏览器时,该行为会变得有点棘手。要解决此问题,您可以执行一些复杂的操作,例如在登录回调中通过XHR查询服务器上的用户状态,并假装不知道用户已登录Google +。

答案 1 :(得分:26)

只需在回调函数中检查g-auth-window:

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

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

        }
    }

答案 2 :(得分:9)

我遇到了这个问题并使用了auth2.disconnect()

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

    //do other stuff
}

编辑: 您需要在断开连接之前存储令牌,因为在某些情况下,断开后id_token将变为null:

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

    //use idToken for server side verification
}

如果我是正确的,您有自己的网站登录机制,只需要谷歌登录就可以通过验证的电子邮件注册用户。在这种情况下,您可以在获得个人资料信息后轻松断开连接。 下次加载页面时,您将看到“登录”按钮而不是“登录”按钮。

答案 3 :(得分:3)

不幸的是,当我请求用户数据时,调用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);
    }
  });

答案 4 :(得分:3)

我也有同样的问题,我如何修理它。我可能不确定这是一个标准的做法,但它仍然可以与我合作...

从谷歌开发者那里添加这个Google JS

<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>

我希望这有效......

答案 5 :(得分:3)

我正在使用https://developers.google.com/identity/sign-in/web/build-button为我的网络应用构建登录按钮,让用户可以选择通过Facebook或Google登录。 这段代码很容易获得Id_token。 但是,如果用户已经登录,它还会自动登录用户。

因此,在脚本开头添加以下代码段有助于我控制注册过程。

public int getLineNumberAt(JTextPane pane, int pos) {
    return pane.getDocument().getDefaultRootElement().getElementIndex(pos);
}

谢谢!

答案 6 :(得分:2)

我们的AngularJS解决方案是:

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

答案 7 :(得分:1)

我一直在努力解决这个问题,并且无法通过登录的“简单实施”找到防止自动登录Google的方法

我最终使用的custom integration不会尝试自动登录(也允许我在同一时间更改外观)

答案 8 :(得分:1)

当您开始将Google登录和OAuth访问令牌同时用于其他Google服务时,已接受的答案不再起作用。用户注销后,访问令牌将立即失效。相反,我会推荐this SO post的答案,该答案包括将click事件处理程序附加到Google登录按钮。只有用户单击登录按钮并成功登录其Google帐户后,回调事件才会触发。

答案 9 :(得分:0)

我通过在Google登录按钮中添加点击处理程序来解决此问题。单击处理程序将全局Javascript变量google_sign_in设置为true。当onSuccess()处理程序触发时(无论是在页面加载时自动生成,还是在用户单击登录按钮时手动生成),它首先检查google_sign_in == true,然后才执行继续登录用户:

<div id="google-signin2" onclick="return do_click_google_signin();"></div>

<script>
    var google_sign_in = false; // assume

    function do_click_google_signin() {
        google_sign_in = true;
    }

    function onSuccess( googleUser ) {
        if ( google_sign_in ) {
            // Process sign-in
        }
    }

    // Other redundant login stuff not shown...
</script>