用于 Firebase 实时数据库/Firebase 身份验证的 Android 唯一密钥

Posted

技术标签:

【中文标题】用于 Firebase 实时数据库/Firebase 身份验证的 Android 唯一密钥【英文标题】:Android unique key for firebase realtime database / firebase authentication 【发布时间】:2017-07-07 21:44:20 【问题描述】:

我正在开展一个项目,用户应该能够在没有任何登录的情况下使用应用程序。但他们也应该能够使用他们的谷歌帐户登录,以将他们的数据与多台设备同步。

如何获得“匿名”用户的唯一标识符?我知道存在诸如.push().getKey() 之类的方法可以从实时数据库中获取 uid,但是我可以在设备上的何处存储此密钥?

我也在使用 firebase 身份验证,因此当人们使用他们的 google 帐户进行应用程序时,我可以使用来自 firebase 身份验证的 Uid。在 firebase 身份验证中还有一个匿名用户选项,但我不想这样做,因为这只会临时存储数据。

【问题讨论】:

"但是我可以在设备的什么地方存储这个密钥?" - Firebase 数据库也有离线支持。你可以阅读更多关于它here 【参考方案1】:

你混淆了两件事:

Firebase 数据库有一个名为 push() 的方法,该方法生成的 ID 在统计上保证是唯一的。 Firebase 身份验证为每个注册用户生成一个 UID,该 UID 在所有用户中都是唯一的。

这两个值彼此没有关系。

如果您想识别用户,请使用 Firebase 身份验证注册用户并使用用户的 UID 来识别他们。如果您不希望您的用户必须登录,请使用anonymous authentication。这很简单:

FirebaseAuth.getInstance().signInAnonymously();

然后你通过等待他们注册获得他们的 UID:

FirebaseAuth.getInstance(). addAuthStateListener(new FirebaseAuth.AuthStateListener() 
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) 
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) 
            // User is signed in
            Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
         else 
            // User is signed out
            Log.d(TAG, "onAuthStateChanged:signed_out");
        
        // ...
    
);;

UID 会自动为您存储在设备上。所以onAuthStateChanged 也会在用户重新启动应用程序时触发。如果用户之前没有登录过,请务必只致电signInAnonymously

【讨论】:

用户无需注册即可完全使用该应用。如果他们想“备份”或同步他们的数据,他们可以选择这样做。对于匿名用户,如果我每次应用启动时不调用signInAnonymously(),他们来自firebase身份验证的UID会保持不变吗? 是的。调用 signInAnonymously() 会创建一个在应用重新启动之间保持不变的 UID。因此,除非您再次调用它,否则用户将保持相同的 UID,并且他们的 Firebase 身份验证帐户甚至可以链接到其他提供商(请参阅firebase.google.com/docs/auth/android/account-linking)。 所以我想在我的数据库中使用这个匿名 UID 作为用户标识符是安全的吗?如果我做的一切都正确,不会丢失任何数据? 只要用户不清除您的应用程序的数据或卸载它,它就是安全的。为此,请考虑使用电子邮件和密码身份验证(无需验证电子邮件即可工作),并在用户不知情的情况下通过 uuid 生成两者。这仅在您希望用户能够在不注册的情况下备份和恢复数据时才有用,但此过程需要手动恢复和保留这些信息,这可能会导致安全问题

以上是关于用于 Firebase 实时数据库/Firebase 身份验证的 Android 唯一密钥的主要内容,如果未能解决你的问题,请参考以下文章

Angular 5,订阅firebase,第一个元素是undefined

Firebase Firestore:如何在 Android 上将文档对象转换为 POJO

用于 Firebase 实时数据库/Firebase 身份验证的 Android 唯一密钥

如何通过 firebase 托管在 firebase 上托管 node.js Web 应用程序(包含多个文件夹)?

用于聊天应用的 Firebase 实时数据库或 Firestore? [关闭]

将数据从firebase函数返回到android [重复]