我使用 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)
以获得有效刷新令牌的答案。
始终拥有有效令牌的正确方法是什么?
只是为了让它非常清楚:
FirebaseAuth.getInstance().getCurrentUser()
开始返回 null,除非我退出并重新登录,否则它不会再次开始工作。您能否指出在使用 firebase 登录后保持有效令牌的正确实现方式是什么?
如果您能提供最少的工作代码,那也会很有用。 谢谢!