0

我正在使用 Firebase 简单登录,它接受正确的登录,拒绝不正确的登录,然后悄悄地让我注销(不知道它是否有效)。我正在努力解决的是:当我的应用程序启动时,我需要确定用户是否仍然登录(如果他们选择“记住我”,就会发生这种情况)。如果是这样,我会继续前进,否则我会显示一个登录屏幕。

我观察到的是,如果我unauth在整个 Firebase 上调用该函数,然后尝试使用该check方法,则返回到该块的错误为 NULL,并且用户电子邮件仍然与上次登录的用户相同。如果我logout在 auth 对象上使用该方法,也会发生同样的情况。

这是一个 RubyMotion 应用程序,所以我可以在 REPL 中使用它,看看发生了什么。

更新:我正在添加代码,因此遇到此问题的其他任何人都可以看到发生了什么。事实证明,这在 motion-firebase 中是一种特质。我将为此提交修复程序。与此同时,这是我的代码:

设置的代码:

def init_firebase
  @fire_ref = Firebase.new('https://my-fine-firebase.firebaseio.com')
  @auth = FirebaseSimpleLogin.new(@fire_ref)
end

def login(email, password, &block)
  status = MotionMap::Map.new({error: 'success', user: nil})

  @auth.login(email: email, password: password) { |error, user|
    status.user = user

    if error.nil?
      if user.nil?
        status.error = "no error but user is nil"
      end
      block.call(status)
    else
      status.error = error.localizedDescription
      block.call(status)
    end

  }
end

因此,调用我的登录方法会响应 Firebase 回调,并在完成时依次在我的 Ruby 代码中执行一个闭包。这一切都有效。这些MotionMap东西只是一个很好的方法来获得无关访问的哈希值。

现在,在 REPL 中我可以这样做:

(main)> error = nil
(main)> f.unauth{|e| error = e}
(main)> p error
nil

(main)> error = user = nil;
(main)> a.check{|e, u| error = e; user = u}
(main)> p error
=> nil
(main)> puts user.email
=> 'my_real_email_address'

所以我做的第一件事就是取消对这个特定的 Firebase 引用的授权,对吧?然后,我继续检查。错误为 nil(Objective-C 中为 NULL),但用户信息完好无损。换句话说,我不能说我的用户是未经授权的。

更新:调用unauthFirebase 对象似乎不会影响check查看登录状态的方式。我对motion-firebase中的注销方法做了一个简单的修复,似乎logout在auth对象上调用该方法实际上会清除该对象中的信息并调用unauthFirebase对象。这只是我从观察正在发生的事情中推断出来的。

应该注意,调用check(映射到(void)checkAuthStatusWithBlock:(void ( ^ ) ( NSError *error , FAUser *user ))block)是异步运行的,完成后调用块,出现nil错误和完全为空的用户。

错误是nil预期的行为吗?

4

1 回答 1

0

随意发布一些您遇到问题的确切代码以获得更准确的答案。

Firebase 使用回调来确定用户所处的状态。根据您为 FireBase 使用的 ruby​​ 包装器,实现可能会有所不同。Firebase 通常为您提供三个选项:Success(如果用户已经通过身份验证或刚刚成功通过身份验证)、Error(出现问题)和 Else(用户未登录)。在这些回调中的每一个中,您都可以指定要执行的操作。

于 2014-06-14T18:51:29.860 回答