0

私は HTML 5 を使用していくつかのものを開発し、同じ中に Facebook JavaScript SDK を挿入しています。

私がしたいFacebookアプリケーションを開発しました:

FB.LOGIN()1) ユーザーが facebook にログインしていない場合、ログインを求められますが、ユーザーがログインしてアプリケーションを開くと、ユーザーがリンクを再度クリックする必要がなく、自動的に許可を求める必要があります。

スタック オーバーフローに関する質問が 1 つあります。Facebook アプリケーションがインストール後に必要なアクセス許可を自動的に要求するようにするにはどうすればよいですwindow.top.location = "<?php echo $loginUrl; ?>";か?

JavaScript コード:

<div id="fb-root"></div>
<script>
    // Load the SDK asynchronously
    (function(d){
        var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        ref.parentNode.insertBefore(js, ref);
    }(document));

    // Init the SDK upon load
    window.fbAsyncInit = function() {
        FB.init({
            appId      : 'appid', // App ID
            channelUrl : '//www.domain.com/channel.html', // Channel file
            status     : true, // Check login status
            cookie     : true, // Enable cookies to allow the server to access the session
            xfbml      : true  // Parse XFBML
        });

        FB.getLoginStatus(function(response) {
            if (response.status === 'connected') {
                var uid = response.authResponse.userID;
                var accessToken = response.authResponse.accessToken;

                document.getElementById('auth-loggedout').style.display = 'none';
                document.getElementById('auth-loggedinnotauthenticate').style.display = 'none';
                document.getElementById('loginauthenicated').style.display = 'block';
            }
            else
                if (response.status === 'not_authorized') {
                    window.top.location = "https://www.facebook.com/dialog/oauth?client_id=id&redirect_uri=http://apps.facebook.com/appp/";
                }
                else {
                    window.top.location = "https://www.facebook.com/login.php?api_key=id&skip_api_login=1&display=page&cancel_url=http://apps.facebook.com/appp/";
                }
    });
</script>
4

2 に答える 2

3

これを使って:

FB.getLoginStatus(function(response) {
    if (response.authResponse) {
        fbUserId = response.authResponse.userID;
        token = response.authResponse.accessToken;
    }
    else {
        FB.login(function(response) {
            if (response.authResponse) {
                fbUserId = response.authResponse.userID;
                token = response.authResponse.accessToken;
            }
            else {
                 console.log('User cancelled login or did not fully authorize.');
            }
        }, {scope: 'user_location'});
    }
},true);
于 2012-04-06T08:56:01.693 に答える
1

認証された紹介機能を使用するのが最善の方法だと思います。つまり、Facebook が認証と必要な権限を処理します。

ユーザーが認証プロセスを通過した後にのみ、ユーザーはアプリケーションに渡されます。

なんらかの理由でそれがあなたに合わない場合は、認証のドキュメント、特にサーバー側のフローを確認してください。

JavaScript コードから、Facebook SDK を初期化するときにチャネル URL プロパティを使用していないようです。JavaScript SDK ドキュメント( Channel Fileセクション)に記載されているとおり:

チャネル ファイルは、特定のブラウザーでのクロス ドメイン通信に関するいくつかの問題に対処します。

その後:

channelUrl パラメータはオプションですが、推奨されます。

それが修正されるとは約束できませんが、修正される可能性があります。

次のようになります。

// Init the SDK upon load
window.fbAsyncInit = function() {
    FB.init({
        appId      : 'appid', // App ID
        channelUrl : '//www.domain.com/channel.html', // Channel File
        status     : true, // Check login status
        cookie     : true, // Enable cookies to allow the server to access the  session
        xfbml      : true  // Parse XFBML
    });

    FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {
            var uid = response.authResponse.userID;
            var accessToken = response.authResponse.accessToken;

            document.getElementById('auth-loggedout').style.display = 'none';
            document.getElementById('auth-loggedinnotauthenticate').style.display = 'none';
            document.getElementById('loginauthenicated').style.display = 'block';
        }
        else
            if (response.status === 'not_authorized') {
                window.top.location = "https://www.facebook.com/dialog/oauth?client_id=id&redirect_uri=http://apps.facebook.com/appp/";
            }
            else {
                window.top.location = "https://www.facebook.com/login.php?api_key=id&skip_api_login=1&display=page&cancel_url=http://apps.facebook.com/appp/";
            }
});

// Load the SDK asynchronously
(function(d){
    var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js";
    ref.parentNode.insertBefore(js, ref);
}(document));

ご覧のとおり、最初にwindow.fbAsyncInitコールバック メソッドを定義してから、SDK をロードする必要があります。

于 2012-04-06T08:28:55.530 に答える