我使用angularfire(Ionic应用程序)登录facebook按钮,并使用$ authWithOAuthRedirect重定向到facebook身份验证页面,然后返回应用程序。
如果我在调用facebook重定向身份验证的函数内部有一个$ onAuth方法,它会起作用,但如果它在该函数之外它不起作用。我还有一个用于通过电子邮件和密码进行身份验证的表单,如果$ onAuth在facebook身份验证方法中,那么电子邮件和密码登录将无法正常工作。
这是使用正在初始化firebaseAuth的Auth服务的控制器:
/****
* Login Page Controller
* Uses angularfires OAuth for facebook login
****/
angular.module('starter')
//inject the Auth service from loginService.js
.controller('LoginController', ['$scope', '$state', 'Auth', function($scope, $state, Auth) {
//userlogin scope variables: error, authData
$scope.userLogin = {
error: null
};
//Login for email password
$scope.loginUser = function() {
Auth.$authWithPassword({
email: $scope.userLogin.email,
password: $scope.userLogin.password
})
.then(
function(authData){
$scope.userLogin.authData = authData;
},
function(error) {
if(error.code == 'INVALID_EMAIL') {
$scope.userLogin.error = "Invalid Email";
}
else if(error.code == 'INVALID_PASSWORD'){
$scope.userLogin.error = "Email or Password is incorrect";
} else {
$scope.userLogin.error = "Enter a valid email and password";
}
}
)
};
//login function for facebook login
$scope.loginUserFacebook = function() {
Auth.$authWithOAuthRedirect('facebook')
.then(function(authData) {
console.log('hi');
})
//if error due to no redirects
.catch(function(error) {
//authenticate with popup for emulators
if (error.code === 'TRANSPORT_UNAVAILABLE') {
Auth.$authWithOAuthPopup('facebook').then(function(authData) {
// console.log(authData);
});
} else {
console.log(error);
}
});
};
//After successful auth
Auth.$onAuth(function(authData) {
if (authData === null) {
console.log('Not logged in');
}
else {
$state.go('driver');
console.log('Logged in as ' + authData.uid);
}
//set authData on controller scope
$scope.userLogin.authData = authData;
});
}]);
因此,如果我将Auth。$ onAuth移动到loginUserFacebook函数中,那么它可以正常工作,但会使用电子邮件和密码搞砸loginUser。
我猜猜Facebook重定向并没有像我想的那样解决一个承诺,但是我已经广泛地浏览了Firebase文档并且无法解决这个问题。
答案 0 :(得分:2)
免责声明:我在Firebase工作
从Auth.$authWithOAuthRedirect(...)
返回的承诺有点误导,因为这个承诺永远不会被解决 - 它只会失败。如果您尝试在不支持浏览器重定向的平台上使用浏览器重定向(例如,PhoneGap),我们将抛出TRANSPORT_UNAVAILABLE
错误,并且承诺将被拒绝。在所有其他"成功"例如,浏览器将重定向到OAuth提供程序,然后返回到您的应用程序,但是承诺的先前状态不再可用。
要在浏览器重定向成功后获取身份验证会话,只需使用Auth.$onAuth(function(authData){...})
来监控身份验证状态。在OAuth提供程序的第一次返回时,引擎盖下的Firebase客户端将完成会话的创建,并将事件引发到使用用户当前身份验证状态传递给onAuth(function(authData){...})
的回调。