10

これを使用して認証を実装しており、現在、ユーザーがボタンをクリックしてサインインすると、React に読み込み中のアイコンが表示され、auth2 アカウントの選択/ログイン ウィンドウが表示されます。

ただし、ユーザーがウィンドウを閉じた場合、発生したイベントはないようです。つまり、promise を返す signIn() 関数は解決されません。ウィンドウが閉じている場合、Google はこの promise に対してエラーを返すと思っていました。その結果、ローダー アイコンの表示を停止して、ログイン メニューを再表示する方法がありません。

誰かがこれに対する解決策を持っているかどうか疑問に思っていましたか?

4

2 に答える 2

1

API は、ユーザーが [拒否] ボタンをクリックしたことを検出するメカニズムを提供しますが、ユーザーがポップアップ ウィンドウを突然閉じた (または Web ブラウザーを終了した、コンピューターをシャットダウンしたなど) ことを検出する組み込みの方法はありません。 . Deny条件は、スコープを縮小してユーザーに再度プロンプトを表示する場合に提供されます (たとえば、「電子メール」を要求したが、プロファイルのみが必要であり、ユーザーが電子メールを提供せずに続行できるようにする場合など)。

サインイン コールバックからの応答にエラーが含まれているaccess_denied場合、ユーザーが拒否ボタンをクリックしたことを示します。

function onSignInCallback(authResult) {
  if (authResult['error'] && authResult['error'] == 'access_denied') {
    // User explicitly denied this application's requested scopes
  }
}

ウィンドウが閉じられたかどうかを検出せずにサインインを実装できるはずです。これは、ほぼすべての Google+ サンプル アプリで実証されています。つまり、現在行っているようにスピナーを使用することは避け、代わりに、ユーザーが正常にサインインするまで認証された UI を非表示にする必要があります。

これを行うことはお勧めしませんが、ポップアップの終了の検出を実装するには、グローバルwindow.open呼び出しをオーバーライドしてから、window.unload で検出するか、ユーザー認証なしでウィンドウが閉じられたかどうかをポーリングすることができます。

var lastOpenedWindow = undefined;
window.open = function (open) {
    return function (url, name, features) {
        // set name if missing here
        name = name || "default_window_name";
        lastOpenedWindow = open.call(window, url, name, features);
        return lastOpenedWindow;
    };
}(window.open);

var intervalHandle = undefined;
function detectClose() {
  intervalHandle = setInterval(function(){
    if (lastOpenedWindow && lastOpenedWindow.closed) {
      // TODO: check user was !authenticated
      console.log("Why did the window close without auth?");
      window.clearInterval(intervalHandle);
    }
  }, 500);
}

私が実装したように、このメカニズムは信頼性が低く、競合状態の影響を受けることに注意してください。

于 2016-02-16T22:14:16.727 に答える