在 Android 应用中使用 Firebase (BaaS) 存储电子邮件和密码时如何包含用户名?

Posted

技术标签:

【中文标题】在 Android 应用中使用 Firebase (BaaS) 存储电子邮件和密码时如何包含用户名?【英文标题】:How do you include a username when storing email and password using Firebase (BaaS) in an Android app? 【发布时间】:2015-11-16 00:56:56 【问题描述】:

Firebase createUser() 方法采用电子邮件和密码字段,但如果我还想允许用户使用类似于 Snapchat、Instagram、*** 等的自定义用户名怎么办?有什么方法可以修改现有方法以也接受该字段,或者我是否需要手动推送和管理此信息,如果需要如何?

这是我第一次尝试存储所需的用户信息:

Firebase ref = new Firebase(firebaseURL);
ref.createUser(email, password, new Firebase.ValueResultHandler<Map<String, Object>>() 
@Override
public void onSuccess(Map<String, Object> result) 
System.out.println("Successfully created user account with uid: " + result.get("uid"));

//Sign user in
Firebase ref = new Firebase(firebaseURL);
ref.authWithPassword(email, password, new Firebase.AuthResultHandler() 

@Override
public void onAuthenticated(AuthData authData) 
System.out.println("User ID: " + authData.getUid() + ", Provider: " + authData.getProvider());

//Save user info
Firebase userRef = new Firebase(firebaseURL + "Users/");
User user = new User(username, authData.getUid());
userRef.setValue(user);

这是好的做法吗?我想用用户名存储 UID 可能会帮助我在将来处理更改等。此外,我是否应该实施 updateChildren()push() 方法,以便如果这是一个社交媒体应用程序,条目不会被覆盖?

这是我的第二次尝试:

  @Override
  public void onAuthenticated(AuthData authData) 
  System.out.println("User ID: " + authData.getUid() + ", Provider: " + authData.getProvider());

  //Save user info and username
  Firebase ref = new Firebase(firebaseURL);
  Map<String, String> map = new HashMap<String, String>();
  map.put("email", email);
  map.put("username", username);
  map.put("provider", authData.getProvider());

  ref.child("users").child(authData.getUid()).setValue(map);

【问题讨论】:

【参考方案1】:

显示一个包含三个字段的表单:

    用户名 电子邮件地址 密码

将后两个发送到 Firebase 的 createUser() 方法。然后在完成回调中,将所有信息存储在您的 Firebase 数据库中。

var userName, emailAddress, password;

// TODO: read these values from a form where the user entered them

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.createUser(
  email    : emailAddress,
  password : password
, function(error, authData) 
  if (error) 
    console.log("Error creating user:", error);
   else 
    // save the user's profile into the database so we can list users,
    // use them in Security and Firebase Rules, and show profiles
    ref.child("users").child(authData.uid).set(
      provider: authData.provider,
      name: userName
    );
  
);

有关详细信息,请参阅 Firebase 文档中storing user data 上的此页面。

【讨论】:

抱歉回复晚了。这似乎适用于 javascript。我需要为 android 开发 Java。每个人的设置似乎略有不同,我在翻译时遇到了麻烦。 当然。 编辑您的问题以包含您尽最大努力的代码,我会看看。 会的!我非常感谢您愿意提供帮助!首先快速提问:users 父对象和authData.uid 对象...您是否必须手动将它们写入数据库,还是在使用 createUser 时自动创建?它们没有出现在我的 firebase 仪表板中,而且我已经对一些伪用户进行了身份验证。出于用户隐私目的,这些对象是否被隐藏或无法访问? 代码是JavaScript,应该是Java! 如果用户的连接在创建帐户之后但在设置用户名之前断开,这不会导致问题吗?【参考方案2】:

是的,有一种方法可以在 Firebase 中更新用户信息。 您所需要的一切 - 阅读 Firebase 文档中的这篇文章并实施此处描述的方法Update user info

使用此方法可以更新 FirabaseUser 对象的 diplayName 属性。只需为 displayName 属性设置用户名并提交您的更改。

希望对你有帮助。

【讨论】:

即使另一个答案是有效的,这是问题的真正答案。 这应该是公认的答案。在这种情况下,您无需在数据库中存储用户名。 这就是答案。【参考方案3】:

这是将注册的详细信息存储在数据库中的一种方法,

Map<String, String> parameters = new HashMap<>();
FirebaseDatabase mFirebaseInstance;
parameters.put(Constant.TAG_USER, strUsrS.trim());
parameters.put(Constant.TAG_EMAIL, strEmailS.trim());
parameters.put(Constant.TAG_PASS, strPassS.trim());
//use this if needed(pushId)
String pushId = mFirebaseInstance.getReference(YOUR TABLE NAME).getRef().push().getKey();
parameters.put(Constant.TAG_KEY, pushId.trim());

mFirebaseInstance.getReference(YOUR TABLE NAME).getRef().child(strUsrS.trim()).setValue(parameters);

试试这个实现并执行...谢谢

希望您了解如何在 firebase 中更改(创建)具有必填字段的表。

Related question & discussion with solutions

【讨论】:

以上是关于在 Android 应用中使用 Firebase (BaaS) 存储电子邮件和密码时如何包含用户名?的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Firebase 连接到 Android 应用 |此应用无权使用 Firebase 身份验证

在android中使用firebase电话身份验证时应用程序崩溃

我是不是需要 Firebase 才能在我的 Android 应用中使用 Google 登录? [复制]

在 Android 中使用 Redux 结构和 Firebase

可以在firebase中的ios和android项目之间共享用户进行身份验证

GoogleSignInResult 在使用 Firebase 的 Android 应用程序中返回 DEVELOPER_ERROR