如何知道有效的FirebaseAuth是否即将过期

时间:2019-07-10 21:28:04

标签: android firebase firebase-realtime-database firebase-authentication firebase-security-rules

我的应用程序中有与firebase数据库有关的怪异行为。

尝试在数据库中执行某些操作时遇到了意外的access denied。这可能是我的代码中的错误,但是是一个非常简单的代码。 我想用真实的场景来说明问题,请阅读要求

1-我只有1个应用程序正在访问数据库(android)
2-我在整个应用程序中只有一种方法尝试访问导致拒绝访问的特定节点
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 :(得分:0)

嗯,我想您可以通过检查用户是否与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");
    }
});