【问题标题】:AngularJS Firebase logout user not workingAngularJS Firebase注销用户不起作用
【发布时间】:2016-08-25 06:47:13
【问题描述】:

我的注销功能,链接到注销按钮是:

$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。

但是,如果我在第一次打开应用程序时尝试进入搜索页面,那么在任何人登录之前,它都会给我正确的错误消息并退出登录页面。

如何确保用户退出后无法返回应用?

【问题讨论】:

  • getAuth 后缺少括号:console.log(ref.getAuth());
  • @FrankvanPuffelen 添加了它们,现在它在注销后打印 null。为什么它会说找到了 Auth Data。

标签: javascript angularjs ionic-framework firebase firebase-authentication


【解决方案1】:

欢迎来到异步编程 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;
    }
  ])

输出将是:

在验证之前

onAuth 之后

在回调中

这可能不是您编写此代码时所期望的。

在您的代码中解决此问题的最简单方法是使用 同步 ref.getAuth() 方法:

.factory("AuthData", [
    function () {
      var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
      return ref.getAuth();
    }
  ])

但是您会经常遇到这种异步问题。我强烈建议使用和研究 AngularFire 而不是重新发明轮子。

【讨论】:

    【解决方案2】:

    您永远不会在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;
    }
    ])
    

    【讨论】:

    • onAuth() docs onAuth() 应该是一个监听器,因此理想情况下,数据应该在身份验证状态发生变化时更新。
    • 那么您可能错过的只是一个 else 语句。我已经更新了我的代码,所以你可以试试
    • 你能把它放在 plunkr 里吗?
    • 这是一个离子项目found here 它托管在this link
    • 如果我没记错的话,Ionic 项目有类似 plunkr 的网站。虽然记不起名字了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2018-10-26
    相关资源
    最近更新 更多