登录后如何始终保持有效的 FireBase 令牌

时间:2021-06-07 08:21:23

标签: android firebase firebase-authentication access-token

我使用 firebase-auth 登录:

我使用firebase登录的方法是

firebaseAuth .signInWithEmailAndPassword(email, password)

登录后,我从 FirebaseAuth 中唯一需要的是一个有效令牌,该令牌将作为其他请求中的标头发送到后端。 我处理令牌检索的方式是这样的(这也是我在stackoverflow上找到的一个示例,其他人声称它对他们有用):

public class FirebaseUserIdTokenInterceptor implements Interceptor {

    // Custom header for passing ID token in request.
    private static final String X_FIREBASE_ID_TOKEN = "YOUR-CUSTOM-HEADER";

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        try {
            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
            if (user == null) {
                throw new Exception("User is not logged in.");
            } else {
                Task<GetTokenResult> task = user.getToken(true);
                GetTokenResult tokenResult = Tasks.await(task);
                String idToken = tokenResult.getToken();

                if (idToken == null) {
                    throw new Exception("idToken is null");
                } else {
                    Request modifiedRequest = request.newBuilder()
                            .addHeader(X_FIREBASE_ID_TOKEN, idToken)
                            .build();
                    return chain.proceed(modifiedRequest);
                }
            }
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }
}

stackoverflow 上还有其他人说这个实现对他们有用。 这个实现也适用于我,我可以在这个拦截器中获得一个有效的令牌,我可以将它附加到标头中的其他请求中。

问题是 - 在使用应用程序几天后,或将应用程序留在后台一段时间后,此实现停止工作。 更准确地说,FirebaseAuth.getInstance().getCurrentUser() 开始返回 null,除非我手动退出并再次登录,否则我无法让应用再次运行。

我知道一些关于这个主题的文章,比如这个 https://medium.com/firebase-developers/why-is-my-currentuser-null-in-firebase-auth-4701791f74f0

以及其他指向使用 onIdTokenChanged(FirebaseAuth auth) 以获得有效刷新令牌的答案。

始终拥有有效令牌的正确方法是什么?

只是为了让它非常清楚:

  1. 我的登录没有问题
  2. 登录后我可以获得一个有效的令牌
  3. 我也可以获得一个工作令牌,即使是几天,但在某些时候 FirebaseAuth.getInstance().getCurrentUser() 开始返回 null,除非我退出并重新登录,否则它不会再次开始工作。

您能否指出在使用 firebase 登录后保持有效令牌的正确实现方式是什么?

如果您能提供最少的工作代码,那也会很有用。 谢谢!

0 个答案:

没有答案
相关问题