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

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

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

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);

【问题讨论】:

    标签: android firebase firebase-authentication firebase-realtime-database


    【解决方案1】:

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

    1. 用户名
    2. 电子邮件地址
    3. 密码

    将后两个发送到 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

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2017-11-25
      • 2016-11-18
      • 2018-03-12
      相关资源
      最近更新 更多