我想在我的网络应用程序中使用 Firebase,该应用程序适用于疗养院中的痴呆症患者。他们没有电子邮件或社交网络帐户,因此需要简单的用户名/密码注册/登录。
最简单的方法是什么?从我在文档中看到的,我必须使用自定义身份验证流程,但我没有现有的身份验证服务器。
如果我确实需要这样做,提供令牌的最简单方法是什么? Azure 有 Functions,AWS 有 Lambda,但我在这里看不到 Firebase
您可以使用
sign in with custom token
Firebase 允许您使用安全的 JSON Web 令牌 (JWT) 对用户或设备进行身份验证,从而使您可以完全控制身份验证。您在服务器上生成这些令牌,将它们传回客户端设备,然后使用它们通过
signInWithCustomToken()
方法进行身份验证。
signInWithCustomToken()
方法从服务器使用自定义令牌登录更多详细信息可以阅读此文档
在末尾添加虚拟域是一种修补,应该避免。 要启用用户名登录,只需按照以下简单步骤操作即可。
注册
注册时请输入用户名、电子邮件和密码。使用普通电子邮件和密码注册用户。成功后,将电子邮件根据 user_id 保存在单独的节点(分支)中。
mButtonSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isValid()){
mProgressBar.setVisibility(View.VISIBLE);
final String userId = mEditTextUserId.getText().toString();
final String emailId = mEditTextEmail.getText().toString() ;
String password = mEditTextPassword.getText().toString() ;
firebaseRef.createUser(emailId, password, new Firebase.ResultHandler() {
@Override
public void onSuccess() {
firebaseRef.child("user_ids").child(userId).setValue(emailId);
Toast.makeText(getBaseContext(),"You are successfully registered ",Toast.LENGTH_SHORT).show();
mProgressBar.setVisibility(View.GONE);
}
@Override
public void onError(FirebaseError firebaseError) {
mProgressBar.setVisibility(View.GONE);
Toast.makeText(getBaseContext(),firebaseError.toString(),Toast.LENGTH_SHORT).show();
}
});
}
}
});
数据库
数据库结构将如下所示
登录
检查用户是否输入了电子邮件或用户 ID。如果是电子邮件 ID,则直接使用它执行登录,否则获取与用户名关联的电子邮件 ID 并执行登录。
Button buttonLogIn = (Button)findViewById(R.id.button_login);
buttonLogIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mProgressBar.setVisibility(View.VISIBLE);
String username = mEditTextEmail.getText().toString() ;
final String password = mEditTextPassWord.getText().toString() ;
// Check if it is an email or not
if(android.util.Patterns.EMAIL_ADDRESS.matcher(username).matches()) {
performLogin(username,password);
}else{
//get the emailId associated with the username
firebaseRef.child("user_ids").child(username)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot!=null){
String userEmail = dataSnapshot.getValue(String.class);
performLogin(userEmail,password);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
//Handle Error
}
});
}
}
});
private void performLogin(String emailId, String password) {
firebaseRef.authWithPassword(emailId,password, new Firebase.AuthResultHandler() {
@Override
public void onAuthenticated(AuthData authData) {
uid = authData.getUid() ;
Toast.makeText(getBaseContext(), authData.toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void onAuthenticationError(FirebaseError firebaseError) {
Toast.makeText(getBaseContext(), firebaseError.toString(), Toast.LENGTH_SHORT).show();
}
});
}
您也可以使用阿方索的解决方案。如果您需要真实的电子邮件,您可以在用户注册时为电子邮件设置一个文本字段,您可以将其保存在数据库中并可以使用它。
我无法找到 Firebase 对此的支持。 但是,执行以下操作将解决您的问题。
注册
private void clickListener() {
registerbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String email = emailEdit.getText().toString();
String pass = passwordEdit.getText().toString();
if (email.isEmpty()) {
emailEdit.setError("Lutfen Kullanici Adinizi Giriniz.");
return;
}
if (pass.isEmpty()) {
passwordEdit.setError("Lütfen Parolanizi Giriniz.");
return;
}
email=email+"@gmail.com";
createAccount(email,pass);
}
});
}
private void createAccount(String email, String pass){
auth.createUserWithEmailAndPassword(email, pass)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
FirebaseUser user=auth.getCurrentUser();
updateUi(user,pass);
}
else{
Toast.makeText(MainActivity.this, "Error: "+
task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
}
这样我们就可以将短语“@gmail.com”添加到电子邮件中。
email=email+"@gmail.com";
我们以“abdulkerim”为例。即使用户输入短语“abdulkerim”,我们也会得到一个用户名而不是电子邮件,这要归功于我们添加到末尾的“@gmail.com”。