我在使用javascript代码Facebook邀请朋友时遇到了一些麻烦。细节:
-
用户Facebook A已经授权我们的web应用程序,并允许我们离线访问他们的访问令牌
-
用户A登录到web。系统检测到A将他的账户(在我们的网站上)与Facebook同步,因此它从Facebook检索A的信息。
-
在同一浏览器中,A打开新标签页,退出Facebook。
-
用户B借了一台电脑,然后用他的账号:用户Facebook B登录了Facebook。
-
他转到我们的网页(A已经打开的选项卡),然后点击"邀请朋友"。显示用户B的所有好友,不包括用户A
这种情况(虽然很少发生),困扰我们的小组测试人员,因为它可能会导致我们的web应用程序的意外行为(用户可能认为他同步了错误的Facebook帐户)。
为了防止这种情况,我想区分当前登录Facebook的用户(用户B)和已授权我们的应用程序的用户(用户A)。
function showInvitationDialog() {
FB.init({
appId:'${appId}',
cookie: false,
status: true,
xfbml: true
});
FB.getLoginStatus(function (response) {
if (response.session) {
if (response.session.uid != ${fbId}) {
alert("You are currently logged in to FB with another account (different to the account you registered). Please make sure that you don't accidently use others FB account to invite");
return;
}
}
var request_ids = FB.ui({ method: 'apprequests',
message: '<@spring.message code="friends.invitation.message" />',
data: 'hello'});
});
}
上面的代码可以在大多数情况下工作,但是它有一个问题:
- 如果用户X登录Facebook用户X',并且他已经授权我们的应用程序:response.session.uid = X_FacebookId -> ok,我们知道他是谁
- 如果用户X没有登录到Facebook,则响应。session == undefined
- 如果用户X以Facebook用户X’登录,并且他还没有授权我们的应用,响应。session == undefined
所以我不能区分情况2和情况3。在这两种情况下,getLoginStatus的结果是相同的,但我想以不同的方式解决它:
- case 2 ->继续调用函数让"Login dialog"弹出
- 案例3 ->通知用户他登录了错误的Facebook帐户。
对于这种情况有什么解决办法吗?
getLoginStatus()返回一个Json对象,如下所示:
{
status: one of 'not_authorized' / 'connected' / 'unknown'
authResponse: ....
}
not_authorized表示他们登录了facebook,但没有授权你的应用程序,连接意味着他们已经授权了应用程序,未知表示他们没有登录facebook。
(来自内存,所以可能不准确)
另外,您可能想要考虑侦听验证事件,这可能会使这个问题更容易解决。http://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/