アクションを実行する前に、FB JavaScript SDK を使用してかなり基本的な認証ロジック フローを設定し、ユーザーのログイン ステータスとアクセス許可を確認しようとしています (そうでない場合は、アクセス許可を使用してログインするようにユーザーに促します)。
- ユーザーが自分のサイトのテキストエリアにメッセージを入力して Facebook フィードに投稿し、サイトの [Facebook に投稿] ボタンをクリックします。
- クリックに反応して、ユーザーのログイン状況を で確認する
FB.getLoginStatus
。 - へのコールバックで
FB.getLoginStatus
、ユーザーがログインしていない場合は、ログインするように求めます (FB.login
)。 - Iへのコールバックで
FB.login
、適切なパーミッションがあることを確認する必要があるため、 を呼び出します。FB.api('/me/permissions')
そうでない場合は、再度ログインするように促します (FB.login
)。
私が直面している問題はFB.login
、コールバック内で他の FB メソッドを呼び出そうとすると、ブラウザが実行元 (クリック) を追跡できなくなり、ポップアップがブロックされることです。ユーザーが開始したポップアップではないとブラウザーが誤って判断せずに、ユーザーのステータスを確認した後、ユーザーにログインを促す方法がないかどうか疑問に思っていますか?
私は現在、とにかくFB.login()
最初に電話することに戻っています。ただし、このアプローチの望ましくない副作用は、ユーザーが既にアクセス許可を使用してログインしていて、まだ を呼び出しているFB.login
場合、認証ポップアップが開いてから続行する直前に閉じてしまうことです。
何かを行う前にユーザーのログイン状態と権限を確認するのはよくある流れのようで、何かが足りない気がします。コード例を次に示します。
<div onclick="onClickPostBtn()">Post to Facebook</div>
<script>
// Callback to click on Post button.
function onClickPostBtn() {
// Check if logged in, prompt to do so if not.
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
checkPermissions(response.authResponse.accessToken);
} else {
FB.login(function(){}, {scope: 'publish_stream'})
}
});
}
// Logged in, check permissions.
function checkPermissions(accessToken) {
FB.api('/me/permissions',
{'access_token': accessToken},
function(response){
// Logged in and authorized for this site.
if (response.data && response.data.length) {
// Parse response object to check for permission here...
if (hasPermission) {
// Logged in with permission, perform some action.
} else {
// Logged in without proper permission, request login with permissions.
FB.login(function(){}, {scope: 'publish_stream'})
}
// Logged in to FB but not authorized for this site.
} else {
FB.login(function(){}, {scope: 'publish_stream'})
}
}
);
}
</script>