使用Firebase在我的android应用中对两种类型的用户(学生和驱动程序)进行身份验证的最佳方法是什么

时间:2019-04-25 11:52:24

标签: android firebase-authentication

我正在为我的大学交通服务(公共汽车)开发一个Android应用程序。它使学生​​可以知道公共汽车在哪里使用地图。在中表示公交车在地图(谷歌地图)中的位置

我有两种类型的用户(学生,司机)

学生和驾驶员应该首先注册(这是通过使用电子邮件密码的firebase身份验证完成的)

但是主要问题是,想象以下是一个学生的登录凭据;

**电子邮件:** jb@gmail.com

**密码:** 123456

学生可以使用这些凭据登录(在注册后),然后查看地图。

问题是,当我进入驱动程序的登录UI并输入相同的凭据时,它会登录驱动程序(应该用于登录学生)

我知道发生这种情况很明显,因为它会查找所有保存的电子邮件,并匹配密码并记录用户。

但是我需要一种有效的方法来检查它是否真的是学生的登录凭据或驱动程序的登录凭据。

是否可以通过Firebase中的登录凭据(电子邮件和密码)向登录方法发送另一个参数,因此我可以为每个用户传递一个值。 (想象一下,我在注册学生时传递了一个字符串值“ student”,在注册驾驶员时传递了一个“驱动程序”)

所以我可以检索传递的数据,并检查该凭证是学生的还是驾驶员的

非常感谢您!

4 个答案:

答案 0 :(得分:3)

您还应该使用firebase数据库。成功注册后,请在Firebase数据库中记录用户。在每个记录中添加type =“学生”或“驱动程序”。通过这种方式,您可以检查登录类型并根据需要进行修改。

登录时类似的东西:

/**
     * Login with firebase credentials
     */
    private void loginFirebase() {
        progressDialog();
        FirebaseAuth.getInstance().signInWithEmailAndPassword(emailEt.getText().toString().trim(),
                passwordEt.getText().toString().trim())
                .addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (!task.isSuccessful()) {
                            dismissDialog();
                            Toast.makeText(LoginActivity.this, "Login failed: "
                                            + UtilMethods.firebaseAuthFailMessage(task),
                                    Toast.LENGTH_SHORT).show();
                        } else {
                            verifyUserType();
                        }
                    }
                });
    }

    /**
     * Verify if user type is customer or business.
     * If type is customer then allow login else Alert the user
     */
    private void verifyUserType() {
        DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference(Constants.FIREBASE_NODE_USER_DETAILS);
        dbRef.child(FirebaseAuth.getInstance().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String userType = dataSnapshot.child("type").getValue(String.class);
                if (userType != null && userType.equals("customer")) {
                    //checkIfEmailVerified();
                } else {
                    dismissDialog();
                    Toast.makeText(LoginActivity.this, "You are not authorized to access this application!",
                            Toast.LENGTH_SHORT).show();
                    FirebaseAuth.getInstance().signOut();
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                dismissDialog();
                Toast.makeText(LoginActivity.this, "" + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

    }

这是快照: Users DB Snapshot

这是注册过程:

private void signUpMethod() {
        progressDialog();
        final String email = emailEt.getText().toString().trim();
        final String password = passwordEt.getText().toString().trim();
        //authenticate user
        firebaseAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            dismissDialog();
                            // there was an error
                            Toast.makeText(SignUpActivity.this, "" + task.getException().getMessage(),
                                    Toast.LENGTH_SHORT).show();
                        } else {
                            addUserDetailsToDatabase(task.getResult().getUser());
                        }
                    }
                });
    }

    private void addUserDetailsToDatabase(FirebaseUser user) {

        DatabaseReference databaseReferenceUsers = firebaseDatabase.getReference("users").child(user.getUid());

        Users usersDetails = new Users();
        usersDetails.setName(storeFullNameEt.getText().toString());
        usersDetails.setMobile(mobileEt.getText().toString());
        usersDetails.setEmail(user.getEmail());
        usersDetails.setAddress(addressEt.getText().toString());
        usersDetails.setCity(cityEt.getText().toString());
        usersDetails.setState(stateEt.getText().toString());
        usersDetails.setPinCode(pinCodeEt.getText().toString());
        usersDetails.setCustomerUId(user.getUid());

        databaseReferenceUsers.setValue(usersDetails).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                dismissDialog();
                firebaseAuth.signOut();
                finish();
            }
        });

    }

这是您的模型类,根据需要创建字段:

@IgnoreExtraProperties
public class Users {

    private String name;
    private String mobile;
    private String email;
    private String address;
    private String city;
    private String state;
    private String pinCode;
    private String customerUId;

    public Users() {
        name = "";
        mobile = "";
        email = "";
        address = "";
        city = "";
        state = "";
        pinCode = "";
        customerUId = "";
    }

    @PropertyName("name")
    public String getName() {
        return name;
    }

    @PropertyName("name")
    public void setName(String name) {
        this.name = name;
    }

    @PropertyName("mobile")
    public String getMobile() {
        return mobile;
    }

    @PropertyName("mobile")
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    @PropertyName("email")
    public String getEmail() {
        return email;
    }

    @PropertyName("email")
    public void setEmail(String email) {
        this.email = email;
    }

    @PropertyName("address")
    public String getAddress() {
        return address;
    }

    @PropertyName("address")
    public void setAddress(String address) {
        this.address = address;
    }

    @PropertyName("city")
    public String getCity() {
        return city;
    }

    @PropertyName("city")
    public void setCity(String city) {
        this.city = city;
    }

    @PropertyName("state")
    public String getState() {
        return state;
    }

    @PropertyName("state")
    public void setState(String state) {
        this.state = state;
    }

    @PropertyName("pinCode")
    public String getPinCode() {
        return pinCode;
    }

    @PropertyName("pinCode")
    public void setPinCode(String pinCode) {
        this.pinCode = pinCode;
    }

    @PropertyName("customerUId")
    public String getCustomerUId() {
        return customerUId;
    }

    @PropertyName("customerUId")
    public void setCustomerUId(String customerUId) {
        this.customerUId = customerUId;
    }
}

答案 1 :(得分:2)

Firebase身份验证在这些类型的用户之间没有区别。它所做的只是确定用户是否是他们所声称的那个人。验证用户身份后,您的应用程序必须对用户类型进行区分。

通常,您可以通过在数据库(例如,实时数据库或Cloud Firestore)中存储每个用户的类型来做到这一点。在其中,将每个用户的UID与他们的类型相关联:

<asp:Repeater ID="PartList" runat="server">
    <ItemTemplate>
        <asp:CheckBox ID="selectPart" runat="server"  />
    </ItemTemplate>
</asp:Repeater>

或者,您可以使用自定义声明将用户的类型存储在他们的用户个人资料中。到set the custom claim using the Admin SDK for Node.js

user_types:
  user1: "student"
  user2: "driver"
  user3: "student"
  user4: "student"

由于这是一项敏感的操作,因此只能通过Firebase Admin SDK来完成,您无法在应用中使用它,而只能在受信任的环境中使用它,例如开发机,您控制的服务器,或云功能。

还请参见有关该主题的先前问题:

答案 2 :(得分:1)

我不知道Firebase是否有正式或标准的方法来执行此操作,但是如果不是这种情况,我将在数据库中存储用户类型,然后在登录之前检查信息。逻辑如下:

  1. 获取收到电子邮件的用户类型
  2. 检查返回的类型是否与登录屏幕类型匹配
  3. 如果类型匹配,请执行登录,否则显示一些错误

我希望这会有所帮助。

答案 3 :(得分:1)

我在一个开发的应用程序中使用了相同的方法,而我所做的只是向用户boolean添加true类型(如果是驱动程序)和false(如果是驱动程序)学生,您必须从注册时处理这个证书。因此,登录后,您将获得用户类型!