繁体   English   中英

在 Android 中使用 Firestore 仅使用用户名和密码进行身份验证

[英]Authenticate using only username and password with firestore in Android

我是 android 和 firebase 的新手。 我正在创建一个测验应用程序,用户登录或注册,然后测验开始。 最后,用户和所有其他人的分数按升序显示。 我希望用户仅使用用户名和密码进行注册和登录。 该项目已连接到 firebase。 目前,登录和注册页面中的用户凭据仅存储在字符串变量中。 我想使用自定义身份验证和 Firestore。 我正在关注官方文档firebase.google.com/docs/auth/android/custom-auth?authuser=0 我对使用 Firebase 进行身份验证的第 3 步感到困惑。 我是否从注册表单中获取凭据并将它们发送到像 AuthO 这样的身份验证服务器,然后它会给出一个令牌? 在我收到凭据后,您能否按步骤告诉我该怎么做? 我已经设置了安全规则allow read, write: if request.auth.uid != null; 为firestore。 我是否必须先将其连接到 Firestore 并存储用于身份验证过程的凭据并最终使用它?

如果提供代码片段和有用文档的链接,那将非常有帮助。

下面给出了用于登录和注册页面的 java 文件。

谢谢你。

对于登录页面

package com.guesstasif.guesswhat;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.content.Intent;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

public class MainActivity extends AppCompatActivity {

public static String name;
public static String password;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    EditText nameText = findViewById(R.id.nameText);

    nameText.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView nameText, int actionId, KeyEvent event) {
            boolean handled = false;
            if (actionId == EditorInfo.IME_ACTION_SEND || event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                name = nameText.getText().toString();
                handled = true;
            }
            return handled;
        }
    });

    EditText passwordText = findViewById(R.id.passwordText);

    passwordText.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView passwordText, int actionId, KeyEvent event) {
            boolean handled = false;
            if (actionId == EditorInfo.IME_ACTION_SEND || event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                password = passwordText.getText().toString();
                handled = true;
            }
            return handled;
        }
    });

}

//OnClick of Start button
public void startQuizz(View view){
    Intent p1 = new Intent(this, qPage1.class);
    startActivity(p1);
}

//OnClick to register
public void register(View view){
    Intent signup = new Intent(this, Signup.class);
    startActivity(signup);
}

}

用于登录页面的 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/sign_in"
tools:context=".MainActivity">

<EditText
    android:id="@+id/nameText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="181dp"
    android:width="300dp"
    android:backgroundTint="@color/colorPrimaryDark"
    android:hint="@string/name_input"
    android:imeActionId="10"
    android:imeOptions="actionSend"
    android:inputType="text"
    android:textColorLink="@color/colorPrimaryDark" />

<EditText
    android:id="@+id/passwordText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="255dp"
    android:width="300dp"
    android:backgroundTint="@color/colorPrimaryDark"
    android:hint="Enter your password"
    android:imeActionId="10"
    android:imeOptions="actionSend"
    android:inputType="textPassword"
    android:textColorLink="@color/colorPrimaryDark" />

<Button
    android:id="@+id/start_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="45dp"
    android:background="@color/colorPrimary"
    android:onClick="startQuizz"
    android:text="START"
    android:textColor="@android:color/background_light" />

<TextView
    android:id="@+id/registerText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="140dp"
    android:clickable="true"
    android:onClick="register"
    android:text="Did not register?"
    android:textSize="24sp" />

对于注册页面

package com.guesstasif.guesswhat;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;


public class Signup extends AppCompatActivity {


    public static String signup_name;
    public static String signup_password;
    public static String signup_confirm_password;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_signup);

        EditText sign_up_nameText = findViewById(R.id.sign_up_nameText);

        sign_up_nameText.setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView sign_up_nameText, int actionId, KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_SEND || event.getKeyCode() == android.view.KeyEvent.KEYCODE_ENTER && event.getAction() == android.view.KeyEvent.ACTION_DOWN) {
                    signup_name = sign_up_nameText.getText().toString();
                    handled = true;
                }
                return handled;
            }
        });


        EditText sign_up_passwordText = findViewById(R.id.sign_up_passwordText);

        sign_up_passwordText.setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView sign_up_passwordText, int actionId, KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_SEND || event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                    signup_password = sign_up_passwordText.getText().toString();
                    handled = true;
                }
                return handled;
            }
        });

        EditText sign_up_confirm_passwordText = findViewById(R.id.sign_up_confirm_passwordText);

        sign_up_confirm_passwordText.setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView sign_up_confirm_passwordText, int actionId, KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_SEND || event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                    signup_confirm_password = sign_up_confirm_passwordText.getText().toString();
                    handled = true;
                }
                return handled;
            }
        });

    }

    public void beginQuizz(View view){
        Intent p1 = new Intent(this, qPage1.class);
        startActivity(p1);
    }
}

用于唱歌的 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/sign_in"
    tools:context=".Signup">

    <EditText
        android:id="@+id/sign_up_nameText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="181dp"
        android:width="300dp"
        android:backgroundTint="@color/colorPrimaryDark"
        android:hint="@string/name_input"
        android:imeActionId="10"
        android:imeOptions="actionSend"
        android:inputType="text"
        android:textColorLink="@color/colorPrimaryDark" />

    <EditText
        android:id="@+id/sign_up_passwordText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="251dp"
        android:width="300dp"
        android:backgroundTint="@color/colorPrimaryDark"
        android:hint="Enter new password"
        android:imeActionId="10"
        android:imeOptions="actionSend"
        android:inputType="textPassword"
        android:textColorLink="@color/colorPrimaryDark" />

    <EditText
        android:id="@+id/sign_up_confirm_passwordText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="325dp"
        android:width="300dp"
        android:backgroundTint="@color/colorPrimaryDark"
        android:hint="Confirm password"
        android:imeActionId="10"
        android:imeOptions="actionSend"
        android:inputType="textPassword"
        android:textColorLink="@color/colorPrimaryDark" />

    <Button
        android:id="@+id/Done_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="57dp"
        android:onClick="beginQuizz"
        android:text="Start" />

</RelativeLayout>

使用 firebase 普通身份验证进行身份验证。 此链接将帮助您https://firebase.google.com/docs/auth/android/password-auth

之后,您可以获得 firebase 实时数据库支持。 首先,您需要获得一个从 firebase 身份验证过程生成的唯一 ID。 您可以从中获取它作为用户 ID。 然后使用具有该唯一 ID 的 firebase 实时数据库来存储您的用户相关数据https://firebase.google.com/docs/database/android/start/此链接将有助于配置实时数据库。 根据您的数据使用情况创建合适的实时数据库结构。

如果您按照这种过程来存储数据,则不需要托管任何外部服务器。 按照这个

https://firebase.google.com/docs/database/ios/structure-data 它将有助于创建更有效的实时数据库

在您注册用户的代码段中,您还应该将他们的详细信息存储在 Firebase 数据库中,这将是您制作自己的自定义用户名和密码身份验证应用程序的第一步。

您可以使用这样的代码将用户名和密码存储在 firebase 数据库中。

DatabaseReference ref = FirebaseDatabase.getInstance().getReference();

ref.child("details").child("username").setValue(username);
ref.child("details").child("password").setValue(password);

这会将您的用户刚刚决定的usernamepassword值保存在您的 Firebase 数据库中的 child details

现在要检索这些值并检查它们是否正确,这意味着授予用户登录访问权限,您可以使用这样的代码来检查用户名和密码:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("users");
                    databaseReference.orderByChild("username").equalTo(userNameEntered).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            if(dataSnapshot.exists())
                                Toast.makeText(Main3Activity.this, "Username exists", Toast.LENGTH_SHORT).show();

                                //check your password in the same way and grant access if it exists too
                            else
                                // wrong details entered/ user does not exist

                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });

通过这些链接了解更多信息:

如何在 Android 应用程序中的 Firebase 上使用用户名而不是电子邮件登录

用户名身份验证而不是电子邮件

编辑:正如 FrankvanPuffelen 所说,您不应该像在数据库中那样松散地存储密码。 这只是一个演示代码,可让您开始了解如何实现这种方法。

在此处阅读有关与Firebase 数据库相关的此类安全问题的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM