【问题标题】:How to get userID by user Email Firebase android?如何通过用户电子邮件 Firebase android 获取用户 ID?
【发布时间】:2017-05-30 16:20:32
【问题描述】:

给定一个电子邮件地址,是否可以获取一个人的用户 ID?例如,

如果我有一个包含此人电子邮件的可变电子邮件。我可以通过执行类似的操作来获取他们的 ID

String userID = mAuth.DatabaseReference.getuID.(email);

抱歉,这是一个愚蠢的问题。

编辑:注意,我正在寻找不是当前用户的人的 ID。所以我不能用FirebaseUser user = mAuth.getCurrentUser();

我的数据库的结构是这样的,所以 ID 已经存储在数据库中了。我只需要一种获取它的方法(在下面显示的图表中,我没有电子邮件字段,但我会添加一个,以防有人想知道-_-)。

另外,如果可能的话,我想根据他们的电子邮件或在我获得 ID 后通过 ID 获取他们的个人资料图片。

【问题讨论】:

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


【解决方案1】:

解决此问题的简单方法是创建另一个模型(表),其中包含用户的电子邮件地址和 ID。这样您就可以检索具有电子邮件的 ID。有使用 java-script 的解决方案,但运行时间复杂。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我通过为模型类创建一个新属性来解决这个问题,您想从另一个帐户访问其数据。

    如下所示,我的模型类现在有 5 个属性。最初只是前四个。

    public class User {
    
        public String id;
        public String name;
        public String email;
        public String role;
        public String uid;
    
        public User() {
        }
    
        public User(String id, String name, String email, String role, String uid) {
            this.id = id;
            this.name = name;
            this.email = email;
            this.role = role;
            this.uid = uid;
        }
    
        public String getId() {
            return id;
        }
    
        public String getName() {
            return name;
        }
    
        public String getEmail() {
            return email;
        }
    
        public String getRole() {
            return role;
        }
    
        public String getUid() {
            return uid;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public void setRole(String role) {
            this.role = role;
        }
    
        public void setUid(String uid) {
            this.uid = uid;
        }
    
    }
    

    在这个类中,我之前没有放置 uid 属性。 因此,当我登录时,我无法访问另一个帐户的 uid。这就是为什么我改变了上面给出的模型类,现在我可以通过使用任何其他参数来访问任何数据来检查是否相等。

    例如,

    mRef.addValueEventListener(new ValueEventListener() {
            private String role;
    
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot snapshot: dataSnapshot.getChildren()){
                    User user = snapshot.getValue(User.class);
    
                    role = user.getRole();
                    if(role!=null){
                        if(role.equals("student")){
                            STUDENT_LIST.add(user);
                        }
                    }
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {}
        });
    

    在这里你可以看到我正在获取所有 学生 用户,他们的值可以使用添加到的 uid 访问上述模型类,来自另一个登录帐户。

    【讨论】:

      【解决方案3】:

      Firebase 不会根据电子邮件提供用户信息。 您可以做一件事使用您的凭据登录,并在成功登录后使用下面的代码来获取用户的详细信息。

      FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
                                  if(currentFirebaseUser !=null)
      
          {
              Log.d(TAG, "onComplete: currentUserUid---->" + currentFirebaseUser.getUid());
              Log.d(TAG, "onComplete: currentUserEmail---->" + currentFirebaseUser.getEmail());
              Log.d(TAG, "onComplete: currentUserDisplayName---->" + currentFirebaseUser.getDisplayName());
          } else
      
          {
              Log.d(TAG, "onComplete: currentUserUid is null");
          }
      

      【讨论】:

        【解决方案4】:

        如果您想在受信任的服务器上通过电子邮件查找用户,可以使用 Firebase Admin SDK。来自documentation on retrieving user data

        admin.auth().getUserByEmail(email)
          .then(function(userRecord) {
            // See the tables above for the contents of userRecord
            console.log("Successfully fetched user data:", userRecord.toJSON());
          })
          .catch(function(error) {
            console.log("Error fetching user data:", error);
          });
        

        用于 Firebase 身份验证的客户端 SDK 仅提供对当前已通过身份验证用户的个人资料的访问权限。他们不提供通过电子邮件地址查找用户的方法。为了允许客户端查找,常用的方法是将 UID-by-email-address 存储在数据库中:

        "emailToUid": {
            "SumOne@domain,com": "uidOfSumOne",
            "puf@firebaseui,com": "uidOfPuf"
        }
        

        通过这个简单的列表,您可以通过以下地址的编码电子邮件地址查找 UID:

        ref.child("emailToUid").child("SumOne@domain,com").addSingleValueEventListener(...
        

        另见:

        【讨论】:

        • 所以,我需要将 uid 存储一个值,它不可能通过使用电子邮件从根元素获取 uid?我还可以获得此人(不是当前用户)的图像配置文件吗?
        • Firebase 身份验证的客户端 SDK 仅提供对当前经过身份验证的用户的配置文件的访问。我在回答中澄清了这一点。
        • 在应用程序端任何策略在没有用户登录的情况下检查登录提供程序类型...想要防止重置进行社交登录的用户的密码...目前在 android 中的所有登录邮件 id 上获取重置密码链接
        • @FrankvanPuffelen 将 uidToEmail 作为键不是更符合逻辑吗?我认为用户的电子邮件地址可能会改变,但 UID 不会?
        • 您必须将点更改为逗号是正确的,但请注意,电子邮件地址中允许使用诸如 $ 之类的字符串,但不能作为 firebase 键,因此您还必须将其更改为 some签名。
        【解决方案5】:

        这样您就可以使用电子邮件和密码登录用户并检索 id:

        FirebaseAuth.getInstance().signInWithEmailAndPassword(email,password).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                  @Override
                  public void onSuccess(AuthResult authResult) {
                      FirebaseUser user = authResult.getUser();
                  }
              });
        

        【讨论】:

          猜你喜欢
          • 2018-11-28
          • 2020-12-04
          • 1970-01-01
          • 2019-05-29
          • 1970-01-01
          • 2017-01-23
          • 1970-01-01
          • 2016-04-05
          • 1970-01-01
          相关资源
          最近更新 更多