一直在浏览谷歌和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步和第2步,第3步是问题,打开的窗口也有网址https://www.facebook.com/home.php?_rdr
答案 0 :(得分:0)
在 FB.login 方法的文档中,它清楚地说明了:
调用FB.login会导致JS SDK尝试打开弹出窗口 窗口。因此,只应在用户单击后调用此方法 事件,否则大多数浏览器都会阻止弹出窗口。
如果您想坚持客户端流程,那么本教程中提到了可用的选项:Client-Side Authentication。
tsOverflow编辑: 根据与Nitzan Tomer的聊天讨论,我发现上述工作的问题: