FB.login生成新窗口,无法获取访问令牌

时间:2012-04-18 22:26:53

标签: jquery facebook facebook-javascript-sdk facebook-login

一直在浏览谷歌和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浏览。当我关闭那个新窗口时,它会在我的日志记录中执行“用户取消登录”。

我在这里缺少什么?所有资源只是建议调用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 event subscribe'
  2. 打印'fb login'
  3. 代码点击FB.login - &gt;打开一个新的浏览器窗口到Facebook,用户登录后焦点停留在新窗口,它永远不会进入FB.login中的回调函数
  4. 如果我关闭上面步骤3中生成的窗口,则会调用回调函数并且“用户取消登录或未完全授权”。打印('response.authResponse:'给出null)
  5. 预计第1步和第2步,第3步是问题,打开的窗口也有网址https://www.facebook.com/home.php?_rdr

1 个答案:

答案 0 :(得分:0)

FB.login 方法的文档中,它清楚地说明了:

  

调用FB.login会导致JS SDK尝试打开弹出窗口   窗口。因此,只应在用户单击后调用此方法   事件,否则大多数浏览器都会阻止弹出窗口。

如果您想坚持客户端流程,那么本教程中提到了可用的选项:Client-Side Authentication

tsOverflow编辑: 根据与Nitzan Tomer的聊天讨论,我发现上述工作的问题:

  1. 使用的AppId在Facebook上注册到其他站点URL,因此即使您在本地测试,也需要确保AppId具有相同的域URL
  2. 缺少channel.html