我正在尝试使用Facebook登录Ember应用程序。登录操作正常,但我找不到如何在初始化应用程序时检查用户是否已登录。
我正在调用auth.authResponseChange
事件,但它会阻止该应用,但它永远不会启动。
App.ApplicationController = Ember.Controller.extend({
fbUser: false,
init: function() {
this.checkFBUser()
},
checkFBUser: function() {
FB.Event.subscribe('auth.authResponseChange', function(response) {
// this is never triggered and the app does not init
console.log(response)
if (response.status === 'connected') {
console.log('Logged in')
}
else {
FB.login()
}
})
},
// this works
actions: {
loginFacebook: function() {
var self = this
FB.login(function(response) {
if (response.authResponse) {
FB.api('/me', function(response) {
self.set('fbUser', response)
})
}
})
}
}
})
我该怎么做?
答案 0 :(得分:0)
我最近没有和FB一起工作,但我很确定AuthResponeChange事件是为了通知AuthResponse状态的变化;在这种情况下,你可能想要看一下FB.getLoginStatus。
https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus
checkFBUser: function()
{
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
// the user is logged in and has authenticated your
// app, and response.authResponse supplies
// the user's ID, a valid access token, a signed
// request, and the time the access token
// and signed request each expire
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
} else if (response.status === 'not_authorized') {
// the user is logged in to Facebook,
// but has not authenticated your app
} else {
// the user isn't logged in to Facebook.
}
});
答案 1 :(得分:0)
我找到了问题的根源和解决方案。我不确定这是最好的解决方案,所以我对其他建议持开放态度,但如果这可以帮助其他人,那就是:
问题是Facebook库尚未加载,因此FB
变量未定义。出于某种原因,如果你试图在Ember中使用未定义的变量做某事,应用程序就会在没有警告的情况下工作。所以解决方案是等待:
App.deferReadiness()
function checkFB() {
if (typeof FB !== 'undefined') {
APp.advanceReadiness()
}
else {
setTimeout(checkFB, 10);
}
}
setTimeout(checkFB, 10);
10毫秒非常短,所以应用程序仍然很快初始化,在我的测试中,应用程序在~20毫秒后启动。这仍然感觉有点hacky,但现在可以做到更好的解决方案。
答案 2 :(得分:0)
正如Aaron所说,您需要使用fb.getLoginStatus来检查用户是否已经登录。为了确保在您进行任何调用之前加载Facebook,您可以使用初始化程序并推迟应用程序,直到SDK加载完毕。
http://nerdyworm.com/blog/2013/04/03/ember-initializers/
Ember.Application.initializer({
name: 'init_fb',
initialize: function (container) {
window.App.deferReadiness();
Ember.$.getScript( '//connect.facebook.net/en_UK/all.js', function( ) {
FB.init( {
appId : 'xxxxxxxxxxxxx',
xfbml : true,
version : 'v2.0',
} );
window.App.advanceReadiness();
} );
}
});