相关疑难解决方法(0)

谷歌登录击中两次?

我正在通过JS使用谷歌登录,看来我的代码获取数据两次.我不确定为什么会这样.

当我点击"使用Google登录"按钮时,它会向用户吐出(console.log(result))数据.然后出现提示,要求我选择我的帐户(我登录了几个谷歌帐户).当我点击我想要的帐户时,代码会再次吐出该用户数据.

为什么会这样?这是一个问题,因为在我吐出数据的地方,我想做一个ajax调用来验证用户,然后重定向它们.所以从本质上说,它试图这样做两次 - 这并不酷,如果我不想使用凭据登录google在第一次转发时回传?

(function() {
   var po = document.createElement('script');
   po.type = 'text/javascript'; po.async = true;
   po.src = 'https://apis.google.com/js/client:plusone.js';
   var s = document.getElementsByTagName('script')[0];
   s.parentNode.insertBefore(po, s);
 })();

function googleLogin() {
    var additionalParams = {
        'callback': googleCallback
    };

    gapi.auth.signIn(additionalParams);
}

function googleCallback(authResult) {
    if (authResult['status']['signed_in']) {
        gapi.client.load('oauth2', 'v2', function() {
            gapi.client.oauth2.userinfo.get().execute(function(resp) {
                console.log(resp);
            })
        });
    } else {
        console.log('Sign-in state: ' + authResult['error']);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:如果我退出所有Google帐户(除了一个且只有一个),谷歌的调用仍然是重复的.这次它登录,我看到console.log()两次输出数据.访问令牌是相同的.

更新2: console.log(resp)输出两次

更新3:更多说明:

萤火虫

javascript google-api google-authentication google-api-client google-oauth

16
推荐指数
1
解决办法
4724
查看次数

用户为signed_out时,Google signInCallback会调用两次

我正在使用谷歌登录混合流来验证用户,但我有一个奇怪的错误:当用户退出(authResult['error'] == 'user_signed_out')时,会signInCallback被调用两次!当用户登录时不会发生这种情况,因此我认为它不会与(相当烦人的)"欢迎回来[用户]"提示相关联.

我的代码看起来像这样:

function signInCallback(authResult) {
    console.log("signIn callback called, using " + authResult['status']['method'] + " method");
    console.log("authResult = ");
    console.dir(authResult);

    if (authResult['code']) {
        // do things....
    }else if(authResult.error == "user_signed_out"){
        // do other things...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在控制台上得到的: console log http://img4.hostingpics.net/pics/968420Capture1.jpg 查看大图

我正在使用的HTML代码:

<div id="signinButton" style="display:<?=(isset($_SESSION['userinfo'])) ? 'none' : 'inline-block'?>">
        <span class="g-signin"
            data-scope="<?=join(' ',$scopes)?>"
            data-clientid="<?=$client_id?>"
            data-redirecturi="<?=$redirect_uri?>"
            data-accesstype="<?=$access_type?>"
            data-cookiepolicy="<?=$cookie_policy?>"
            data-callback="signInCallback"
            data-approvalprompt="<?=$approval_prompt?>"
            data-state="<?=$_SESSION['state']?>"
        ></span>
    </div>
Run Code Online (Sandbox Code Playgroud)

我在两个不同的浏览器上使用两个不同的Google帐户.我最初认为这是由于(谷歌存储在一个cookie中google_account_id和用户状态,如G_USERSTATE_H3 : 'google_account_id#1=0&google_account_id#2=1').但是我在两个浏览器上清除了所有cookie,并且只用了一个浏览器和一个谷歌帐户运行我的测试.我还是得到了这个bug.

这是一个非常讨厌的bug.此外,谷歌Chrome处理得相当好,但是Firefox完全被吓坏了并且执行了三次回调,然后,用户无法登录(他已登录1秒,并立即重新注销).

有人可以帮帮我吗?

更新:这是Google JS Api的包含方式:

<script>
// Asynchronous …
Run Code Online (Sandbox Code Playgroud)

javascript google-api google-login google-oauth google-api-js-client

6
推荐指数
1
解决办法
1077
查看次数