gapi.signIn调用多个回调

时间:2015-01-28 18:26:18

标签: javascript google-authentication

我目前正在使用应用在多个地方调用gapi.signIn方法。

  1. 用户登录时
  2. 用户注册时
  3. 当用户想要将其应用帐户与其Google帐户关联时
  4. 因此,在每个实例中调用gapi.signIn(),并使用不同的回调参数。

    由于在没有重新加载页面的情况下执行了所有操作,这是一个单页面应用程序,后来对上述任何一种方法的调用都会导致触发每个回调。

    实施例。 如果用户登录,则注销并尝试创建新的,他们被告知他们的谷歌帐户已经绑定到帐户(这是预期的行为)。但是,如果他们再次尝试登录,则在尝试创建用户时调用的上一个回调会再次被触发,并且会再次发送到该页面,说明Google帐户与应用帐户绑定。

    用一个简单的代码示例解释一下:

        var ENV = {...};
    
        function handleClickOfButton_1() {
    
            window.authCallback_1 = function() {
                console.log('callback 1');
            };
    
            // attach callback one
            gapi.auth.signIn({
            clientid:     ENV.APP.GOOGLE_AUTH.clientid,
            scope:        ENV.APP.GOOGLE_AUTH.scope,
            cookiepolicy: 'single_host_origin',
            callback:     'authCallback_1',
          });
        }
    
        function handleClickOfButton_2() {
            window.authCallback_2 = function() {
                console.log('callback 2');
            };
    
            // attach callback one
            gapi.auth.signIn({
            clientid:     ENV.APP.GOOGLE_AUTH.clientid,
            scope:        ENV.APP.GOOGLE_AUTH.scope,
            cookiepolicy: 'single_host_origin',
            callback:     'authCallback_2',
          });
        }
    

    如果单击按钮1,触发第一个处理程序,signIn方法将被调用一次,如果我再单击第二个按钮,将调用两个回调方法。

    输出:

    // click button 1
    > callback 1
    
    // click button 2
    > callback 1
    > callback 2
    

    我该怎样防止这种情况?我一直无法找到重置方法。使用相同的回调方法名称,没有帮助。覆盖窗口。[method_name]也不起作用。

1 个答案:

答案 0 :(得分:0)

这就是我所做的 - 添加了一个var counter = 0,它在回调函数的末尾递增。如果counter > 0回调为空。这样它只会添加一次回调函数(这无论如何都是预期的行为,而且首先需要这个hack是令人讨厌的,感谢谷歌这样一个错误的API:/)。

var counter = 0;
gapi.auth.signIn({
  clientid: '1234567890',
  cookiepolicy: 'single_host_origin',
  scope: 'profile email',
  callback: counter > 0 ? null : function signInCallback(authResult) {
    if (authResult['status']['signed_in'] && authResult['status']['method'] == 'PROMPT') {
      var token = authResult.access_token;
      // Update the app to reflect a signed in user
      // Hide the sign-in button now that the user is authorized, for example:
      gapi.client.load('plus', 'v1', function() {
        gapi.client.plus.people.get({
          userId: 'me'
        }).execute(function(response) {
          console.log('Do my thing here...');
        });
      });
    } 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']);
    }
    counter = 1;
  }
});