как узнать, скоро ли истекает действительный FirebaseAuth - PullRequest
0 голосов
/ 11 июля 2019

В моем приложении странное поведение, связанное с базой данных Firebase.

Я получил несколько неожиданных access denied при попытке выполнить некоторые вещи в базе данных ... Это может быть ошибка в моем коде, но это довольно простой код. Я хочу проиллюстрировать ситуацию с реальным сценарием, пожалуйста, прочитайте требования

1 - у меня только 1 приложение для доступа к базе данных (Android)
2 - у меня всего 1 метод во всем приложении, пытающийся получить доступ к определенному узлу, который вызывает отказ в доступе
3- в моих правилах firebase единственное правило, примененное к этому узлу:

".read":"auth != null",
".write":"auth != null" 

4 - Я ДОЛЖЕН проверить четкость FirebaseAuth.getInstance().getCurrentUser() != null прямо перед вызовом метода

это псевдо-фрагмент того, как мой код (я не буду просто писать настоящий код, потому что он слишком длинный)

public void onResume() {
if(FirebaseAuth.getInstance().getCurrentUser() == null)
doLogin();
else
checkFirebaseStuff();
}

Поскольку Google не предоставляет никакой информации о том, почему доступ был отклонен, единственное возможное объяснение, которое я нашел:

пользователь был аутентифицирован, но задолго до этого, поэтому когда он включался, был ли он по-прежнему действителен, но вскоре после того, как функция действительно запустила свой токен (или некоторую другую проверку подлинности в firebase), больше не действовала, поэтому это вызвало доступ запрещен

эта ошибка встречается не часто, у меня 5k ежедневных пользователей, и это происходит около 20 или 50 раз в день, но все равно не должно происходить ни разу
имеет ли это смысл? Кто-нибудь может мне помочь с дополнительной информацией?

1 Ответ

0 голосов
/ 11 июля 2019

Хм, я думаю, вы можете исправить это, проверив, отключен ли пользователь от базы данных firebase, но я не совсем уверен, повлияет ли это и на Auth, вы можете попробовать

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        boolean connected = snapshot.getValue(Boolean.class);
        if (connected) {
            Log.d(TAG, "connected");
            //Here you can update your mAuth state
        } else {
            Log.d(TAG, "not connected");
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        Log.w(TAG, "Listener was cancelled");
    }
});
...