我有一个DispatchActivity作为启动器 Activity ,它用于检查当前是否有用户登录。如果该用户已登录,则将其发送到他们的ProfileActivity。否则,我将它们发送到LogInActivity。这是我在DispatchActivity中的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dispatch);
//.....................
auth = FirebaseAuth.getInstance();
authListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
launchProfileActivity();
} else {
// User is signed out
launchLoginActivity();
}
}
};
}
@Override
public void onStart() {
super.onStart();
auth.addAuthStateListener(authListener);
}
@Override
public void onStop() {
super.onStop();
if (authListener != null) {
auth.removeAuthStateListener(authListener);
}
}
无论我做什么,firebaseAuth.getCurrentUser()都不会在我的主要测试设备上返回null。根据文档,除非当前有一个用户登录,否则getCurrentUser()将为null。当我记录该用户的某些详细信息时,它们与我之前创建的“测试”用户一致(即,调用user.getEmail()返回“[email protected]”。
这是有问题的,因为我最肯定在控制台的用户数据库(在Authentication/Users中)没有任何用户。我前一段时间从数据库中删除了该测试用户,数据库为空。
我尝试在另一台设备上运行该应用程序,并且该应用程序正常运行。但是,在我的主要测试设备上执行全新安装并不能解决该问题。
问题:
据我所知,该问题与设备的某种持久性用户状态有关。因为运行其他设备可以正常工作。由于我没有故意配置这种情况的发生,因此我想知道是什么导致了我的Auth用户数据库和设备之间的这种不一致。
如果数据库为空,那么auth.getCurrentUser()从何处获取此先前删除的用户对象?
谢谢你。
最佳答案
Firebase身份验证将在用户登录时为用户缓存身份验证 token 。这样可以避免对用户与Firebase提供的其他服务进行的每一次微小交互进行身份验证的过程。该 token 会定期自动刷新,但在此之前,SDK会假定该 token 代表用户。您会发现 token 会在一段时间后过期,或者您可以通过卸载和重新安装该应用程序或清除其数据来强制该问题。
身份验证有效,无论实时数据库的内容如何。它们彼此独立,除非安全规则将访问权限限制为当前经过身份验证的用户。
关于Android FirebaseAuth.getCurrentUser()永不为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41797358/