正解です。認証ダイアログの第2段階はオプションです。ユーザーは、認証ダイアログのドキュメントの[アクセス許可]セクションに記載されているように、要求するすべての拡張アクセス許可またはそれらのいずれかを受け入れる必要はありません。
ユーザーは、これらのアクセス許可を削除するか、この段階を完全にスキップすることができます。これにより、要求したすべての拡張アクセス許可が拒否されます。アプリは、インストールされたユーザーの拡張権限のサブセットの失効を処理できる必要があります。
私が思う最善のアプローチは、ユーザーが受け入れるものでアプリを管理することですが、オプションの段階で権限(拡張権限)を持っている必要がある場合は、これがあなたができることです:
FB.init({
....
});
var requiredPermissions = ["email", "publish_stream", "publish_action"];
function checkPermissions(response) {
var ok = true;
if (!response.data || response.data.length != 1)
ok = false;
else for (var perm in requiredPermissions) {
if (!(perm in response.data[0])) {
ok = false;
break;
}
}
if (!ok)
login();
else
console.log("Hey there user who granted all the required permissions");
}
function loginCallback(response) {
if (response.authResponse) {
FB.api("/me/permissions", checkPermissions);
}
else {
console.log("User cancelled login or did not fully authorize.");
}
}
functoin login() {
FB.login(loginCallback, { scope: requiredPermissions.join(",") });
}
私はこのコードをテストしていませんが、それは正しい方向への微調整です。また、このコードは、ユーザーがすべてのアクセス許可を受け入れるか、単に放棄するまで永久に続きます。何らかの方法で、それらのアクセス許可が必要であることをユーザーに知らせ、認証ダイアログに再度送信しようとしている必要があります。
編集
私はこれを私の答えに含めることを忘れ続けています:FB.loginを呼び出すと新しいポップアップウィンドウが開き、ドキュメントに記載されているように、ユーザーの操作の結果でない限り、ブラウザは通常それをブロックします:
FB.loginを呼び出すと、JSSDKがポップアップウィンドウを開こうとします。そのため、このメソッドはユーザーのクリックイベントの後にのみ呼び出す必要があります。そうしないと、ほとんどのブラウザでポップアップウィンドウがブロックされます。
それはまたそこに言います:
アプリケーションですでに認証されているユーザーからさらにアクセス許可を収集する必要がある場合は、ユーザーに付与するアクセス許可を使用してFB.loginを再度呼び出します。認証ダイアログでは、ユーザーはまだ付与されていない権限のみを求められます。
これは、それがあなたが望むことをする方法であることを意味します、それがあなたのブラウザによってブロックされたので、ポップアップはおそらく開かなかったでしょう。ログイン関数を呼び出すたびに、ユーザーがページを操作した後になるように、私が提供したコードを変更する必要があります。つまり、「アプリケーションにはこれとその権限が必要です。続行するにはこのボタンをクリックしてください」というメッセージを表示します。次に、ログイン関数を呼び出します。