Аутентификация с использованием только имени пользователя и пароля в Firestore в Android - PullRequest
0 голосов
/ 25 октября 2018

Я новичок в Android и FireBase.Я создаю приложение для викторины, в котором пользователь входит или регистрируется, а затем начинается викторина.В итоге счет пользователя и всех остальных отображается в порядке возрастания.Я хочу, чтобы пользователь подписывался и входил, используя только имя пользователя и пароль.Проект связан с пожарной базой.В настоящее время учетные данные пользователя на страницах входа и регистрации хранятся только в строковых переменных.Я хочу использовать кастомную авторизацию и firestore.Я следую официальной документации firebase.google.com / docs / auth / android / custom-auth? Authuser = 0 .Я запутался с шагом 3 из Authenticate с Firebase.Должен ли я взять учетные данные из формы регистрации и отправить их на сервер аутентификации, такой как AuthO, и он выдаст токен?Подскажите, пожалуйста, что делать, пошагово, сразу после получения учетных данных?Я установил правило безопасности allow read, write: if request.auth.uid != null; для пожарного магазина.Должен ли я сначала подключить его к пожарному депо и сохранить учетные данные для процесса аутентификации и использовать его в конце концов?

Было бы очень полезно, если предоставляются фрагменты кода и ссылки на полезные документы.

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>

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

В фрагменте кода, в котором вы регистрируете пользователя, вы также должны сохранить их данные в базе данных Firebase, что станет вашим первым шагом для создания собственного пользовательского приложения для аутентификации имени пользователя и пароля.

Вы можете использоватькод, подобный этому, для хранения имени пользователя и пароля в базе данных firebase.

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

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

Это сохраняет значения username и password, которые ваш пользователь только что определил в вашей базе данных Firebase, под дочерним элементом.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) {

                        }
                    });

Перейдите по этим ссылкам, чтобы узнать больше:

Как войти в систему, используя имя пользователя вместо электронной почты на Firebase в приложении Android

Аутентификация имени пользователя вместо электронной почты

РЕДАКТИРОВАТЬ: Как сказал FrankvanPuffelen, вы НЕ ДОЛЖНЫ хранить пароль так свободно, как это было бы в yo.Ваша база данных.Это всего лишь демонстрационный код, с которого можно начать знакомство с реализацией такого подхода.

Подробнее о таких проблемах безопасности, связанных с база данных Firebase, здесь

0 голосов
/ 25 октября 2018

Использовать обычную аутентификацию firebase для аутентификации.эта ссылка поможет вам https://firebase.google.com/docs/auth/android/password-auth

После этого вы можете получить поддержку базы данных Firebase в реальном времени.Прежде всего, вам нужно получить уникальный идентификатор, который генерируется из процесса аутентификации firebase.Вы можете получить это как идентификатор пользователя от этого.Затем используйте базу данных реального времени firebase с этим уникальным идентификатором для хранения данных, относящихся к вашему пользователю https://firebase.google.com/docs/database/android/start/ эта ссылка поможет настроить базу данных в реальном времени.Создайте соответствующую структуру базы данных в режиме реального времени в соответствии с вашими данными.

Вам не нужно размещать внешний сервер, если вы используете этот тип процесса для хранения ваших данных.Следуйте этому

https://firebase.google.com/docs/database/ios/structure-data. Это поможет создать более эффективную базу данных в реальном времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...