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

lam*_*dev 38 google-plus

我正在将Google+登录与我的网站集成,这也允许用户使用Twitter和Facebook登录.因此,该站点的登录页面有3个按钮,每个按钮对应一个服务.

我遇到的问题是在以下场景中:

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

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

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

cla*_*ass 29

更新

防止自动登录的最佳支持方法是使用API​​方法gapi.auth2.getAuthInstance().signOut(),该方法会阻止在您的网站调用后自动登录. 在这里演示.

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

window.onbeforeunload = function(e){
  gapi.auth2.getAuthInstance().signOut();
};
Run Code Online (Sandbox Code Playgroud)

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

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

原帖

首先,您不应该使用data-approvalprompt ="force",因为这将导致向您的应用程序/客户端发出额外的授权子代码,并且旨在用于在凭据丢失后需要重新授权用户的情况-侧.

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

如果您真的想要这样做,您将对登录按钮执行显式渲染,但不会按照Google+登录文档中的说明调用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
}
Run Code Online (Sandbox Code Playgroud)

以下代码显示如何显式呈现按钮:

  <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>  
Run Code Online (Sandbox Code Playgroud)

如何通知用户从您的站点注销用户可能会因站点而异,但一种方法可能是设置一个cookie,指示用户的"已注销"状态,然后将其用作触发器用于阻止显式加载.当用户访问您的网站并禁用cookie或使用单独的登录浏览器时,该行为会变得有点棘手.要解决此问题,您可以执行一些复杂操作,例如在登录回调中通过XHR查询服务器上的用户状态,并假装不知道用户已登录Google+.


Jac*_*ket 26

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

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

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

        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 另一种方法是检查`authResult.status.method`.如果用户发起请求(而不是"AUTO"),它将被设置为"PROMPT". (11认同)

Ali*_*nan 11

我有这个问题,并使用auth2.disconnect()

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

    //do other stuff
}
Run Code Online (Sandbox Code Playgroud)

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

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

    //use idToken for server side verification
}
Run Code Online (Sandbox Code Playgroud)

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