7

Google+ ガイダンスに従って、独自のボタンを使用して Google+ サインイン フローを開始しようとしています。

コールバック関数に関して、gapi.auth.signInリファレンスには次のように書かれています (引用):

「グローバル名前空間の関数。サインイン ボタンが表示されるときに呼び出され、サインイン フローの完了後にも呼び出されます。」

Google サインイン ダイアログが表示され、サインインするように求められますが、ダイアログで何らかの操作が行われる前に、コールバックがすぐに 2 回呼び出されます。どちらの場合も、error="immediate_failed", error_subtype="access_denied", status.signed_in=false で同様の authResult を取得します

何故ですか?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv=Content-Type content="text/html; charset=utf-8" />
    <script src="https://apis.google.com/js/client:platform.js?onload=googleRender" async defer></script>
  </head>
  <body>

<script>
  function googleRender() {  // executed when Google APIs finish loading
    var googleSigninParams = {
      'clientid' : '746836915266-a016a0hu45sfiouq7mqu5ps2fqsc20l4.apps.googleusercontent.com',
      'cookiepolicy' : 'http://civoke.com',
      'callback' : googleSigninCallback ,
      'requestvisibleactions' : 'http://schema.org/AddAction',
      'scope' : 'https://www.googleapis.com/auth/plus.login'
    };
    var googleSigninButton = document.getElementById('googleSigninButton');
    googleSigninButton.addEventListener('click', function() {
      gapi.auth.signIn(googleSigninParams);
    });
  }
  function googleSigninCallback(authResult) {
    console.log('googleSigninCallback called: ');
    console.dir(authResult);
    if (authResult['status']['signed_in']) {
      document.getElementById('googleSigninButton').setAttribute('style', 'display: none');  // hide button
      console.log('User is signed-in to Google');
    } else {
      console.log('User is NOT signed-in. Sign-in state: ' + authResult['error']);
    }
  }
</script>

<button id="googleSigninButton">Sign in with Google</button>

  </body>
</html>
4

1 に答える 1

8

コールバック関数は、ユーザーがログインしたときだけでなく、ステータスが変化したときに常に呼び出されgoogleSigninCallback(authResult)ます。ユーザーがログインしたときに一度だけ返される必要があり、それが必要です。コードは次のとおりです。AUTOPROMPTPROMPT

function googleSigninCallback(authResult) {
  if (authResult['status']['signed_in'] && authResult['status']['method'] == 'PROMPT') {
      // User clicked on the sign in button. Do your staff here.
  } else if (authResult['status']['signed_in']) {
      // This is called when the status has changed and method is not 'PROMPT'.
  } 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']);
  }
于 2014-10-21T14:24:56.743 に答える