我是android和firebase的新手。我正在创建一个测验应用程序,用户在其中登录或注册,然后开始测验。最后,用户的分数和所有其他分数按升序显示。我希望用户注册并仅使用用户名和密码登录。
该项目已连接到Firebase。目前,登录页面和注册页面中的用户凭据仅存储在字符串变量中。
我想使用自定义身份验证和Firestore。我正在关注官方文档firebase.google.com/docs/auth/android/custom-auth?authuser=0。我对“使用Firebase进行身份验证”的第3步感到困惑。我是否可以从注册表单中获取凭据并将其发送到AuthO之类的身份验证服务器,它会提供令牌?收到凭据后,您能分步告诉您该怎么做吗?我已为Firestore设置了安全规则allow read, write: if request.auth.uid != null;
。
我是否必须首先将其连接到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>
答案 0 :(得分:1)
使用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。这将有助于创建更有效的实时数据库
答案 1 :(得分:0)
在注册用户的代码段中,还应将其详细信息存储在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) {
}
});
浏览以下链接以了解更多信息:
How to login using username instead email on Firebase in Android application
Username authentication instead of email
编辑: 正如FrankvanPuffelen所说,您不应像在数据库中那样宽松地存储密码。这只是一个演示代码,可以帮助您入门如何实现这种方法。
详细了解与Firebase database, here相关的此类安全问题