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);
}
私が実装したように、このメカニズムは信頼性が低く、競合状態の影響を受けることに注意してください。