Firebase 匿名身份验证在应用升级后失效

4
这是我所想出的用于处理匿名身份验证的 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

然而,一些用户报告说他们失去了匿名验证,并且实际上失去了他们的数据,因为我的其他内部应用程序屏幕是基于Firebase节点驱动的,这些节点对应于用户的UID。

这很糟糕,但似乎只发生在少数用户身上。而且只有匿名验证才会发生 - 如果出现电子邮件验证,甚至不是什么大问题,因为用户可以重新登录。但是对于匿名验证,这是一个相当大的问题。用户会失去所有内容。

这个问题可能与Firebase SDK更新或应用程序更新有关 - 当它发生时,我的用户似乎最频繁报告。

为什么会发生这种情况?这是否是错误的认证模式?我喜欢使用匿名验证的概念,让用户可以简单地使用您的应用程序而无需登录,我相信这也是Firebase的意图。但是由于这个bug有如此糟糕的影响,我几乎需要给他们提供一个将他们的帐户与实际登录备份的选项。


1
嘿,安东尼。乍一看,你的代码对我来说看起来完全正常,是实现这个功能的一个例子。匿名 UID 只有在以下情况下才会丢失:1)您调用 signOut,2)用户卸载应用程序。如果它确实在升级时丢失,那就是一个退步/错误。这应该很容易重现。你已经试过了吗? - Frank van Puffelen
@FrankvanPuffelen,这种情况并没有发生在我身上,但是我的用户报告了这个问题,所以我不知道如何精确地重现。昨晚我刚刚发布了一个更新,今天下午就收到了两份报告——对我来说感觉不仅仅是巧合。我在我的应用程序中没有使用signOut - Anthony Chuinard
嘿@AnthonyChuinard,我遇到了完全相同的问题,但是我找不到问题/解决方案。关于我的问题更多信息在这里:https://stackoverflow.com/questions/60650500/flutter-firebase-auth-anonymous-currentuser-returns-null/60713699#60713699。你成功解决了这个问题吗?任何帮助都将受到欢迎。谢谢并祝你有愉快的一天。 :) - matox
@matox 不,他们要求我提供日志并重现此问题,但是由于有一万个用户并且只有5-10个人遇到此问题,这真的很难做到。 - Anthony Chuinard
@AnthonyChuinard 我明白了,无论如何还是谢谢你回复。如果你找到任何有用的东西,请告诉我。 :) - matox
2个回答

6

我相信我成功地重现了这个问题。

在收到用户的愤怒邮件后,我测试了一下如果我更新应用程序(为了好玩提高版本号),并在我的设备离线时尝试打开它会发生什么情况。结果发现Firebase让我退出登录,因为我认为它可能认为数据库的内部副本已经过时并完全清除它,所以这基本上等同于重新安装而没有凭据。这种情况不会发生在在线更新和打开应用程序之后。

这就解释了为什么只有极少数用户会遇到这样的问题,因为他们需要是匿名用户,他们需要在更新应用程序后,在没有互联网连接的情况下尝试在其设备上打开它,我认为这种情况不会经常发生。


你有没有想出一个好的(可靠的)解决方案来处理这些情况? - KB_

1
该系统旨在让用户可以匿名模式开始使用,以降低注册的难度。但是您可以编写代码 将匿名账户转换为永久账户。对于愿意提供一些登录凭据的用户,应执行此操作以保留其特权。
如果注销匿名身份验证凭据、用户清除应用程序存储或用户卸载应用程序,则无法继续使用匿名身份验证凭据。

1
谢谢你的快速回复,我理解你们所有的观点,但是有些用户不想在简单的应用程序安装之外保留他们的特权,Firebase提供了这个很棒的功能。我愿意冒卸载和应用存储清除的风险 - 这取决于用户 - 但对我来说,随机失去小部分用户的认证是完全不同的故事。 - Anthony Chuinard
2
同意安东尼的看法:他们的登录状态不应在道格和我强调的情况之外丢失。我们需要了解更多发生这种情况的用户,以确定原因。 - Frank van Puffelen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接