0

グーグルとStackOverflowを見回して、誰もが実際に行うべき同じアドバイスを持っています:

FB.login(function(response) {
    if (response.authResponse) {
        var accessToken = response.authResponse.accessToken;
    }
});

ページに「共有」ボタンがあります。クリックすると、ユーザーのプロファイルに投稿し、https://graph.facebook.com/me/feed呼び出しを使用して投稿します。それを行うには、Facebookのaccess_tokenが必要なので、次のようにしました。

(FB.init()を呼び出し、all.jsを追加した後)

 FB.login(function (response) {
    console.log('response.authResponse: ' + response.authResponse);
     if (response.authResponse) {
                var access_token = FB.getAuthResponse()['accessToken'];
                console.log('Access Token = ' + access_token);
                FB.api('/me', function (response) {
                    console.log('Good to see you, ' + response.name + '.');
                });
     } else {
                console.log('User cancelled login or did not fully authorize.');
     }
  }, { scope: 'user_about_me' });

私が期待していることは、ユーザーがFacebookにログインするためのログインダイアログを開き、ユーザーがログインするとダイアログが閉じて、私のページに戻り、アクセストークンを取得することです。

しかし、何が起こるかというと、ログインダイアログでFacebookに新しいブラウザウィンドウが生成されます。ユーザーがログインすると、ページはユーザーのニュースフィードページに進み、上記のコールバックは呼び出されません。したがって、基本的に、コントロールはなくなり、ユーザーの通常のFacebookブラウジングとして新しいブラウザウィンドウに転送されます。ただし、その新しいウィンドウを閉じると、ログに対して「ユーザーがログインをキャンセルしました」が実行されます。

ここで何が欠けていますか?すべてのリソースは単にFB.loginを呼び出すことを提案しており、それは私がすでに行っていることですが、ユーザーのアクセストークンを取得できないようです。

前もって感謝します!

編集:完全なコードとより多くのコメント

<script type="text/javascript" language="javascript">
    window.fbAsyncInit = function ()
    {
        FB.init(
        {
            appId: '<%= this.ApplicationId %>', // App ID
            channelURL: '<%= this.ChannelFileUrl %>', // Channel File
            status: true, // check login status
            cookie: true, // enable cookies to allow the server to access the session
            oauth: true, // enable OAuth 2.0
            xfbml: true  // parse XFBML
        });

        // Additional initialization code here
    };

    // Load the SDK Asynchronously
    (function (d)
    {
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) { return; }
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/<%= this.LocaleCode %>/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
    } (document));
</script>

次に、この関数を呼び出すいくつかのjsファイルで(実際に投稿していないため、パラメーターはまだ使用されていません)

function postToFacebook(name, caption, description, link, picture, id) {

var accessToken = "";

console.log('fb event subscribe');
FB.Event.subscribe('auth.login', function () {
    console.log('facebook event auth.login');
});

console.log('fb login');

FB.login(function (response) {
        console.log('response.authResponse: ' + response.authResponse);
        if (response.authResponse) {
            var access_token = FB.getAuthResponse()['accessToken'];
            console.log('Access Token = ' + access_token);
        } else {
            console.log('User cancelled login or did not fully authorize.');
        }
}, {});

}

何が起こるかのシーケンスは次のとおりです。

  1. 印刷された「fbイベントサブスクライブ」
  2. 印刷された「fbログイン」
  3. コードがFB.loginにヒット->Facebookへの新しいブラウザウィンドウを開きます。ユーザーログイン後、フォーカスはその新しいウィンドウに留まり、FB.loginのコールバック関数には決して入りません。
  4. 上記の手順3で生成されたウィンドウを閉じると、コールバック関数が呼び出され、「ユーザーがログインをキャンセルしたか、完全に承認しませんでした」。が出力されます('response.authResponse:'はnullを返します)

ステップ1と2が予想されます。ステップ3が問題です。また、開いているウィンドウのURLはhttps://www.facebook.com/home.php?_rdrです。

4

1 に答える 1

0

FB.loginメソッドのドキュメントには、次のように明確に記載されています。

FB.loginを呼び出すと、JSSDKがポップアップウィンドウを開こうとします。そのため、このメソッドはユーザーのクリックイベントの後にのみ呼び出す必要があります。そうしないと、ほとんどのブラウザでポップアップウィンドウがブロックされます。

クライアント側のフローに固執する場合は、このチュートリアルで使用可能なオプションについて説明します:クライアント側の認証

tsOverflow編集:Nitzan Tomerとのチャットディスカッションに基づいて、上記の私の作業の問題を​​発見しました。

  1. 使用されたAppIdはFacebookで別のサイトURLに登録されているため、ローカルでテストしている場合でも、AppIdが同じドメインURLを持っていることを確認する必要があります
  2. channel.htmlがありませんでした
于 2012-04-18T22:29:54.930 に答える