谷歌登录击中两次?

时间:2014-04-11 19:08:34

标签: javascript google-api google-oauth google-api-client google-authentication

我正在通过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']);
    }
}

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

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

更新3:更多说明:

firebug

2 个答案:

答案 0 :(得分:27)

您遇到两次调用" console.log(resp);"在你的" googleCallback"功能因为:

  

将为您的登录回调定义的功能将被调用   每次用户登录状态发生变化

此引用来自"Monitoring the user's session state"网页。

正如您在文章中看到的那样,授权结果对象有三种不同的状态"方法"值:

  • 提示
  • AUTO

因此,当出现登录提示时(>#34; PROMPT")以及"欢迎回来"出现横幅(" AUTO")。

要停止回调代码处理每个触发事件,您可以按如下方式更改代码:

function signinCallback(authResult) {
    if (authResult['status']['signed_in']) {
        // Update the app to reflect a signed in user
        // Hide the sign-in button now that the user is authorized, for example:
        // document.getElementById('signinButton').setAttribute('style', 'display: none');

        if (authResult['status']['method'] == 'PROMPT') {
            console.log(authResult['status']['method']);

            gapi.client.load('oauth2', 'v2', function () {
                gapi.client.oauth2.userinfo.get().execute(function (resp) {
                    console.log(resp);
                })
            });
        }
    } else {
        // Update the app to reflect a signed out user
        // Possible error values:
        //   "user_signed_out" - User is signed-out
        //   "access_denied" - User denied access to your app
        //   "immediate_failed" - Could not automatically log-in the user
        console.log('Sign-in state: ' + authResult['error']);
    }
}

此代码只会调用" gapi.client.oauth2.userinfo.get()"如果用户已登录并且触发回调的事件的类型为" PROMPT"。

答案 1 :(得分:0)

Google总是会通过状态'PROMPT',但是当用户之前成功登录并且他可以自动登录时,状态为'AUTO'。