Мне нужно сделать авторизацию по номеру телефона. В принципе с задачей я уже справился следующим образом:
private EditText etLastName;
private EditText etFirstName;
private TextView tvTextErrors;
private Button button;
private static final int RC_SIGN_IN = 123;
private static final String TAG = "MyApp_Authorization";
private FirebaseUser user;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etLastName = findViewById(R.id.regFamily);
etFirstName = findViewById(R.id.regName);
tvTextErrors = findViewById(R.id.regTextErrors);
button = findViewById(R.id.regButton);
mAuth = FirebaseAuth.getInstance();
}
@Override
public void onStart() {
super.onStart();
// Check if user is signed in (non-null) and update UI accordingly.
user = mAuth.getCurrentUser();
if (Objects.equals(user, null)) {
Authorization();
} else {
if (!Objects.equals(user.getDisplayName(), null) && !Objects.equals(user.getDisplayName(), "")) {
Intent intent = new Intent(this, Global.class);
startActivity(intent);
finish();
}
}
}
private void Authorization() {
//Если входим в первый раз или срок кода доступа истек
List<AuthUI.IdpConfig> providers = Arrays.asList(new AuthUI.IdpConfig.PhoneBuilder().build());
startActivityForResult(
AuthUI.getInstance()
.createSignInIntentBuilder()
.setAvailableProviders(providers)
.setLogo(R.drawable.ic_android_black_24dp)
.setTheme(R.style.AppTheme)
.build(),
RC_SIGN_IN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
//IdpResponse response = IdpResponse.fromResultIntent(data);
if (resultCode == RESULT_OK) {
//Если есть подключение к сети интернет
//После подтверждения по СМС
mAuth = FirebaseAuth.getInstance();
user = mAuth.getCurrentUser();
etFirstName.setVisibility(View.VISIBLE);
etLastName.setVisibility(View.VISIBLE);
button.setText(getString(R.string.toRegister));
if (!Objects.equals(user.getDisplayName(), null) && !Objects.equals(user.getDisplayName(), "")) {
Intent intent = new Intent(this, Global.class);
startActivity(intent);
finish();
}
} else {
//Если нет подключения к сети интернет
tvTextErrors.setText("Проверьте подключение к сети и повторите попытку!");
etFirstName.setVisibility(View.GONE);
etLastName.setVisibility(View.GONE);
button.setText("Повторить попытку");
Log.d(TAG, "Не удалось получить данные пользователя при попыткуе обновления Фамилии и Имени");
}
}
}
public void toRegister(View view) {
if (user != null) {
//Проверка входных данных
boolean access = true;
String textError = "";
String strFirstName = etFirstName.getText().toString();
String strLastName = etLastName.getText().toString();
String strFullName = strLastName + " " + strFirstName;
if (strFirstName.replace(" ", "").length() <= 1 || strLastName.replace(" ", "").length() <= 1) {
textError += "Слишком короткое имя/фамилия.\r\n";
access = false;
}
if (!access) {
tvTextErrors.setText(textError);
return;
} else {
tvTextErrors.setText("");
}
//Если данные были введены верно, сохраняем имя пользователя на сервере авторизации
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName(strFullName)
.build();
user.updateProfile(profileUpdates)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Intent intent = new Intent(MainActivity.this, Global.class);
startActivity(intent);
finish();
} else {
tvTextErrors.setText("Не удалось завершить последний шаг авторизации, проверьте подключение к сети и повторите попытку.");
}
}
});
} else {
//Если не удалось получить данные пользователя из-за отсутствия подключения к сети Интернет
Authorization();
Log.d(TAG, "Не удалось получить данные пользователя при попыткуе обновления Фамилии и Имени");
}
}
Как я понял после авторизации данные для быстрой авторизации хранятся в телефоне и получаю я их методом FirebaseAuth.getInstance().getCurrentUser();
. Так вот у меня вопрос. Есть ли срок годности у этих данных? Или, если устройство утеряно мной, то злоумышленник может через месяц открыть это приложение и автоматически залогиниться без проверки по номеру?
Если у данных пользователя FirebaseAuth.getInstance().getCurrentUser();
нет срока годности, то я могу как-то реализовать авторизацию через токен со сроком годности, но без использования своего сервера?
Не уверен, что у меня хватит ума и времени, чтобы разобраться с установкой и настройкой сервера для администрирования учетных записей в FireBase, чтобы использовать CustomToken. Надеюсь, что доступно описал проблему. Если есть другие простые решения данной проблемы, то они тоже пригодятся.
Заранее благодарен за ответы, особенно подробные и с примерами!)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите пожалуйста, пишу приложение на андроид и есть необходимость вытащить строку с определённым строковым значением которое задано...
Подскажите пожалуйста, как реализовать хранение массива в базе данных? Долго гуглил, но толком ничего не понялЕсли можно, то объясните подробно
Есть следующие интерфейсы, необходимо написать метод Money calculateTotalPrice(Collection shipments), возвращающий сумму стоимости всех товаров (price*amount) с использованием...