Google+ signinCallback两次致电并失去了authresult

use*_*581 29 html javascript google-plus

我的代码中有一个错误.我能够登录并检索用户信息.但又signinCallback被召唤了(我不知道怎么回事).它显示我之前的用户信息已经消失!这是HTML方面:

<span id="signinButton">
    <span
        class="g-signin"
        data-callback="signinCallback"
        data-clientid="CLIENT_ID"
        data-cookiepolicy="single_host_origin"
        data-requestvisibleactions="http://schemas.google.com/AddActivity"
        data-scope="https://www.googleapis.com/auth/plus.profile.emails.read"
        data-width="standard"
        data-height="short">
    </span>
</span>
Run Code Online (Sandbox Code Playgroud)

这是javascript方面:

var AuthStates = {
  google: null
};

function signinCallback(authResult) {
    console.dir(authResult);
    console.log('Sign-in state: ' + authResult['error']+authResult['access_token']);
    AuthStates.google = authResult;
    console.log('signinCallback');
    chooseAuthProvider();
}

function chooseAuthProvider() {
  if (AuthStates.google && AuthStates.facebook) {
    if (AuthStates.google['access_token']) {
      // Signed in with Google, you can now use Google+ APIs.
      console.log(AuthStates.google);
      gapi.client.load('plus','v1', function(){
        var request = gapi.client.plus.people.get({
          'userId': 'me'
        }); 
        request.execute(function(resp) {
          document.getElementById('cname').value =resp.displayName;
          document.getElementById('cemail').value =resp.emails[0].value;
          console.log('Retrieved profile for:' + resp.displayName + ' ' + resp.emails[0].value);
        });
      });
}
}
Run Code Online (Sandbox Code Playgroud)

它在第二个响应控制台上给出了这个响应 signinCallback

Sign-in state: user_signed_outundefined
signinCallback
Run Code Online (Sandbox Code Playgroud)

console.dir(authResult)的结果

Ben*_*ith 1

您在回调方法中调用 request.execute() 会导致回调方法被错误属性中的“user_signed_out”值重新触发。

如果您查看 Google 文档“注销用户”,它会显示:

当用户刷新页面或导航到网站的其他部分时,回调将在错误属性中使用 user_signed_out 值触发,直到用户再次单击登录按钮。

因此我相信是您对 request.execute() 的调用触发了对回调方法的第二次调用。

您可以通过在回调方法中放置一个条件来防止对回调的第二次调用,例如

function signinCallback(authResult) {
 if (authResult['status']['signed_in']) {
  console.dir(authResult);
  console.log('Sign-in state: ' + authResult['error']+authResult['access_token']);
  AuthStates.google = authResult;
  console.log('signinCallback');
  chooseAuthProvider();
 }
}
Run Code Online (Sandbox Code Playgroud)

有关前面提到的保护条件的示例,请参阅有关“监视用户会话状态”的 Google 文档。