0

アクションを実行する前に、FB JavaScript SDK を使用してかなり基本的な認証ロジック フローを設定し、ユーザーのログイン ステータスとアクセス許可を確認しようとしています (そうでない場合は、アクセス許可を使用してログインするようにユーザーに促します)。

  1. ユーザーが自分のサイトのテキストエリアにメッセージを入力して Facebook フィードに投稿し、サイトの [Facebook に投稿] ボタンをクリックします。
  2. クリックに反応して、ユーザーのログイン状況を で確認するFB.getLoginStatus
  3. へのコールバックでFB.getLoginStatus、ユーザーがログインしていない場合は、ログインするように求めます ( FB.login)。
  4. 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>
4

2 に答える 2

2
于 2012-08-02T15:13:00.547 に答える
0

ユーザーが持っているかどうかを確認するよりエレガントな方法のための別のソリューションがあります

  • A) FBにログイン
  • B) 正しい権限

一言で言えば、A) の場合、Fb.login を「コールバック」する代わりに、ユーザーがログインしていないことを「警告」する必要があります。その後、ページを更新し、更新中にログイン プロセスを処理する必要があります。

ただし、B) アクセス許可の場合、fb.login を使用してアクセス許可を要求する代わりに、fb.ui メソッド (display: iframe を使用) を使用して (コールバック経由で) アクセス許可を要求します。display:iframe を使用すると、ポップアップ ブロッカーの煩わしさを防ぐことができます。

以下の変更されたコードを参照してください。

<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 {
            //Don't call FB.login because this results in popup blocker.
            //FB.login(function(){}, {scope: 'publish_stream'})
            //Instead, just alert user that "YOu are not connected to FB", and then refresh the page (which should theoreticalyl handle the logging aspect)
        }
    });
}

// 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 {
                    //Don't use FB.login to request permissions. Instead use a FB.ui ({method:'permissions.request'} with "display" set to "iframe"
                    //FB.login(function(){}, {scope: 'publish_stream'})

                    FB.ui(
                    {
                         method: 'permissions.request',
                         'perms': 'publish_stream,WHATEVER_PERMISSIONS',
                         'display': 'iframe' //THIS IS IMPORTANT TO PREVENT POPUP BLOCKER
                    },
                    function(response) {
                        //Do action if permissions add success other wise prompt error adding permissions.
                    }
                }

            // Logged in to FB but not authorized for this site.
            } else {

                //Don't call FB.login because this results in popup blocker.
                //FB.login(function(){}, {scope: 'publish_stream'})
                //Instead, just alert user that "YOu are not connected to FB", and then refresh the page (which should theoreticalyl handle the logging aspect)
            }
        }
    );
}
</script>
于 2012-10-12T03:21:39.210 に答える