Как указать логин пользователя с именем пользователя и НЕ по электронной почте?
Я бы хотел использовать Firebase для моего веб-приложения, предназначенного для людей с деменцией в доме по уходу. У них нет учетных записей электронной или социальной сети, поэтому вам потребуется простое имя пользователя/пароль для входа/входа.
Каков самый простой способ сделать это? Из того, что я вижу в документах, мне придется использовать пользовательский поток auth, но у меня нет существующего сервера auth.
Если мне действительно нужно это сделать, это самый простой способ предоставить токен? В Azure есть функции, а AWS - Lambda, но я ничего здесь не вижу Firebase
Ответы
Ответ 1
Вы правы, что вход в систему с использованием имени пользователя и пароля не поддерживается изначально в Firebase Auth.
Вы можете реализовать собственного провайдера, как показано в этом примере. Это позволяет вам выполнять любые пользовательские требования, но, по общему признанию, немного сложнее, чем использование встроенных поставщиков.
Обходной путь, который вы можете предпринять, не используя специальную аутентификацию с другим бэкэндом, - это принять имена пользователей в вашем пользовательском интерфейсе, но в базовой логике добавьте "@yourowndomain.com
" перед вызовом функций, чтобы зарегистрироваться или войти по электронной почте.
Таким образом, вы будете использовать аутентификацию по электронной почте/паролю, сопоставляя <username>
с <username>@yourowndomain.com
Ответ 2
Добавление фиктивного домена в конце является своего рода патчем, и его следует избегать.
Чтобы включить имя пользователя, выполните следующие простые действия.
Зарегистрироваться
Во время регистрации используйте идентификатор пользователя, адрес электронной почты и пароль. Зарегистрируйте пользователя с помощью обычной электронной почты и пароля. В случае успеха сохраните письмо против 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();
}
});
}
}
});
Database
Структура базы данных будет выглядеть так
![enter image description here]()
Вход
Проверьте, ввел ли пользователь адрес электронной почты или идентификатор пользователя. Если это идентификатор электронной почты, тогда напрямую войдите с ним, иначе получите идентификатор электронной почты, связанный с именем пользователя, и выполните вход.
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();
}
});
}
Ответ 3
Вы можете использовать sign in with custom token
Firebase дает вам полный контроль над аутентификацией, позволяя аутентифицировать пользователей или устройства с использованием безопасных веб-токенов JSON (JWT). Вы генерируете эти токены на своем сервере, передаете их обратно на клиентское устройство, а затем используете их для аутентификации с помощью метода signInWithCustomToken()
.
- Вам нужно сохранить имя пользователя и пароль в вашей базе данных или rtdb или firestore
- Когда пользователь коснется кнопки входа в систему, клиент отправит имя пользователя и пароль на ваш бэкэнд. Если имя пользователя и пароль верны, сгенерируйте собственный токен и отправьте его обратно клиенту
- Затем клиент может войти в систему с помощью пользовательского токена с сервера, используя метод
signInWithCustomToken()
Более подробно можно прочитать в этой документации
Ответ 4
Вы также можете использовать решение Alfonso. И где вам нужно настоящее электронное письмо, вы можете установить текстовое поле для электронной почты, когда пользователь регистрируется, и вы можете сохранить его в своей базе данных, и вы можете использовать его.