javascript - 谷歌登录点击两次?

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

我正在通过 JS 使用 Google 登录,我的代码似乎获取了两次数据。我不确定为什么会这样。

当我点击“使用 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 帐户(一个且只有一个除外),对 google 的调用仍然重复。这次它登录了,我看到 console.log() 输出了两次数据。访问 token 是相同的。

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

更新 3: 更多说明:

firebug

最佳答案

您遇到了对“console.log(resp);”的两次调用在您的“googleCallback”函数中,因为:

The function that you define for your sign-in callback will be called every time that the user's signed in status changes

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

如文中所见,授权结果对象具有三种不同的状态“方法”值:

  • 提示
  • 自动

因此,当出现登录提示(“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']);
    }
}

如果用户已登录且触发回调的事件类型为“PROMPT”,此代码将仅调用“gapi.client.oauth2.userinfo.get()”函数。

关于javascript - 谷歌登录点击两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23020733/

相关文章:

ruby-on-rails - 网站如何撤销/断开 OAuth 访问权限?

rest - 使用服务帐户和 oauth2 调用 autoML Google API

java - 如何使用 Java 配置在 Google OAuth2 AccountChooser 中设置托管域参数?

javascript - 一旦从选择下拉列表中选择了两个选项,Jquery 就会运行代码

javascript - 链接多个 Array.prototype.*function* 的性能问题是什么?

javascript - Google api auth2 signOut 不工作

javascript - 用于短网址的 Google Analytics

javascript - 使用 jquery 单击其中一个时, Accordion 选择无法正常工作

javascript - 如何更改Jquery克隆位置?

java - FileDataStoreFactory (Google API) 的特定文件名