Вопрос про авторизацию FireBase

181
13 марта 2018, 02:29

Мне нужно сделать авторизацию по номеру телефона. В принципе с задачей я уже справился следующим образом:

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. Надеюсь, что доступно описал проблему. Если есть другие простые решения данной проблемы, то они тоже пригодятся.

Заранее благодарен за ответы, особенно подробные и с примерами!)

READ ALSO
Значения перечисления в switch-case блоке

Значения перечисления в switch-case блоке

У меня есть простое перечисление:

157
Сравнение строк из базы данных с переменной (SQLite)

Сравнение строк из базы данных с переменной (SQLite)

Подскажите пожалуйста, пишу приложение на андроид и есть необходимость вытащить строку с определённым строковым значением которое задано...

184
Как сохранить массив в базу данных SQLite?

Как сохранить массив в базу данных SQLite?

Подскажите пожалуйста, как реализовать хранение массива в базе данных? Долго гуглил, но толком ничего не понялЕсли можно, то объясните подробно

185
Нужна ли реализация интерфейса Money?

Нужна ли реализация интерфейса Money?

Есть следующие интерфейсы, необходимо написать метод Money calculateTotalPrice(Collection shipments), возвращающий сумму стоимости всех товаров (price*amount) с использованием...

126