这就是我在匿名身份验证支持下的Android应用中处理身份验证的方法。
public class StartupActivity extends AppCompatActivity {
FirebaseAuth.AuthStateListener mAuthListener;
@Override
protected void onStart() {
super.onStart();
FirebaseAuth.getInstance().addAuthStateListener(mAuthListener = firebaseAuth -> {
if (firebaseAuth.getCurrentUser() != null) {
LoggedInActivity.newInstance(this);
} else {
IntroActivity.newInstance(this);
}
});
}
@Override
protected void onStop() {
FirebaseAuth.getInstance().removeAuthStateListener(mAuthListener);
super.onStop();
}
}
此StartupActivity
是我的AndroidManifest.xml
中定义的应用程序,它是我应用的主启动器活动。
该模式运行良好:在IntroActivity
的末尾,我的代码对用户进行了匿名身份验证并将其发送到LoggedInActivity
。每次启动后,匿名身份验证都会持续进行,并且用户会直接进入LoggedInActivity
。
但是,由于我的其他内部应用程序屏幕是从与该用户的UID对应的Firebase节点驱动的,因此一些用户报告丢失了其匿名身份验证并有效地丢失了其数据。
这是很糟糕的,但似乎只有少数用户会发生。而且仅对于匿名身份验证-如果发生在电子邮件身份验证中,这甚至不是什么大问题,因为用户可以重新登录。但是对于匿名身份验证,这是一个很大的问题。用户失去了一切。
该问题可能与Firebase SDK更新或应用程序更新有关-那是当它似乎发生最多/我的用户报告最多的时候。
为什么会这样?这是对auth的错误模式吗?我喜欢使用匿名身份验证的概念,它允许用户无需登录即可简单地使用您的应用程序,我相信这也是Firebase的意图。不过,这几乎就像我需要给他们提供使用实际登录名备份他们的帐户的选项,因为此错误会产生严重的影响。
答案 0 :(得分:3)
我相信自己能够重现此问题。
收到用户发来的愤怒邮件后,我测试了如果我更新了该应用程序(提高版本代码以取得很好的效果)并尝试在设备离线时打开它会发生什么情况。事实证明,Firebase让我注销了,因为我认为它可能认为数据库的内部副本已过时并彻底擦除它,因此,它基本上等效于没有凭据的重新安装。在线更新和打开应用程序后,不会发生这种情况。
这可以解释为什么只有极少数用户会遇到这种情况,因为他们需要是匿名用户,他们需要先更新应用程序,然后尝试在设备上没有互联网连接的情况下打开应用程序,我认为这不会经常发生。
答案 1 :(得分:2)
设计该系统的目的是使用户可以以匿名模式开始,以保持较低的注册摩擦。但是您可以将代码编写到convert an anonymous account to a permanent account。对于希望保留其特权(如果他们愿意提供一些登录凭据)的用户,这是您应该采取的措施。
如果您注销匿名身份验证凭据,或者用户清除了应用存储空间,或者用户卸载了该应用,则该凭据可能会丢失。