用于 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 应用程序(包含多个文件夹)?