AngularJS Firebase 注销用户不工作
AngularJS Firebase logout user not working
我的注销功能,链接到注销按钮是:
$scope.logoutUser = function() {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
ref.unauth();
console.log(ref.getAuth);
$state.transitionTo('login');
}
当我单击注销时,它会将此打印到控制台:
function (){x("Firebase.getAuth",0,0,arguments.length);return this.k.P.we()}
我正在检查我的另一个控制器中的 authData:
控制器:
.controller('SearchCtrl',
function ($scope, $http, Movie, $state, UsersRef, AuthData, $timeout) {
$scope.$on('$ionicView.enter', function () {
if (!AuthData) {
console.log("Auth data null!");
swal("Unauthorized", "You are not logged in", "error");
$state.transitionTo('login');
} else {
console.log("Auth data found: " + AuthData);
//do stuff
}
});
})
工厂:
.factory("AuthData", [
function () {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
var data = null;
ref.onAuth(function (authData) {
if (authData) {
data = authData;
}
});
return data;
}
])
如果我注销,然后通过更改 URL 返回到链接到 SearchCtrl 的页面,它仍然说它找到了 authData。
但是,如果我在第一次打开应用程序时尝试转到搜索页面,在任何人登录之前,它会给我正确的错误消息并退出到登录页面。
如何确保用户在注销后无法返回应用程序?
您永远不会在 AuthData
中清理 data
,因此在第一个人登录后它始终会有数据。我不熟悉 Firebase,但您的 AuthData
工厂:
.factory("AuthData", [
function () {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
var data = null;
ref.onAuth(function (authData) {
if (authData) {
data = authData;
}
else
data = null;
});
return data;
}
])
欢迎来到异步编程 101。
Firebase 的 onAuth
方法 侦听 以获取身份验证状态的更改。当身份验证状态更改时,将调用您提供的回调方法。但是在等待身份验证状态更改时,您的其他代码继续 运行.
如果您在代码中添加一些日志语句,最容易看到这一点:
.factory("AuthData", [
function () {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
var data = null;
console.log('before onAuth');
ref.onAuth(function (authData) {
console.log('in callback');
if (authData) {
data = authData;
}
});
console.log('after onAuth');
return data;
}
])
输出将是:
before onAuth
after onAuth
in callback
这可能不是您编写此代码时所期望的。
在代码中解决此问题的最简单方法是使用 同步 ref.getAuth()
方法:
.factory("AuthData", [
function () {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
return ref.getAuth();
}
])
但是您会经常 运行 陷入这个异步问题。我强烈推荐使用和研究 AngularFire 而不是重新发明轮子。
我的注销功能,链接到注销按钮是:
$scope.logoutUser = function() {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
ref.unauth();
console.log(ref.getAuth);
$state.transitionTo('login');
}
当我单击注销时,它会将此打印到控制台:
function (){x("Firebase.getAuth",0,0,arguments.length);return this.k.P.we()}
我正在检查我的另一个控制器中的 authData:
控制器:
.controller('SearchCtrl',
function ($scope, $http, Movie, $state, UsersRef, AuthData, $timeout) {
$scope.$on('$ionicView.enter', function () {
if (!AuthData) {
console.log("Auth data null!");
swal("Unauthorized", "You are not logged in", "error");
$state.transitionTo('login');
} else {
console.log("Auth data found: " + AuthData);
//do stuff
}
});
})
工厂:
.factory("AuthData", [
function () {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
var data = null;
ref.onAuth(function (authData) {
if (authData) {
data = authData;
}
});
return data;
}
])
如果我注销,然后通过更改 URL 返回到链接到 SearchCtrl 的页面,它仍然说它找到了 authData。
但是,如果我在第一次打开应用程序时尝试转到搜索页面,在任何人登录之前,它会给我正确的错误消息并退出到登录页面。
如何确保用户在注销后无法返回应用程序?
您永远不会在 AuthData
中清理 data
,因此在第一个人登录后它始终会有数据。我不熟悉 Firebase,但您的 AuthData
工厂:
.factory("AuthData", [
function () {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
var data = null;
ref.onAuth(function (authData) {
if (authData) {
data = authData;
}
else
data = null;
});
return data;
}
])
欢迎来到异步编程 101。
Firebase 的 onAuth
方法 侦听 以获取身份验证状态的更改。当身份验证状态更改时,将调用您提供的回调方法。但是在等待身份验证状态更改时,您的其他代码继续 运行.
如果您在代码中添加一些日志语句,最容易看到这一点:
.factory("AuthData", [
function () {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
var data = null;
console.log('before onAuth');
ref.onAuth(function (authData) {
console.log('in callback');
if (authData) {
data = authData;
}
});
console.log('after onAuth');
return data;
}
])
输出将是:
before onAuth
after onAuth
in callback
这可能不是您编写此代码时所期望的。
在代码中解决此问题的最简单方法是使用 同步 ref.getAuth()
方法:
.factory("AuthData", [
function () {
var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
return ref.getAuth();
}
])
但是您会经常 运行 陷入这个异步问题。我强烈推荐使用和研究 AngularFire 而不是重新发明轮子。