我正在尝试获取一个 Firebase token 来验证我对 Rest API 的调用。我可以使用以下代码异步生成 token 。
FirebaseUser mUser = App.getFirebaseAuth().getCurrentUser();
if (mUser!=null) {
mUser.getIdToken(false)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
ID_TOKEN = task.getResult().getToken();
} else {
Log.e(App.TAG, "Firebase Token task ended with error.");
}
}
});
} else {
Log.i(App.TAG,"User is null, no Firebase Token available");
}
ID_TOKEN 是一个保存结果的静态字符串变量。 问题是,我正在构建我的请求并添加身份验证 header 。
headers.put("Authentication",
"Bearer + ID_TOKEN);
问题是,由于 Firebase token 是异步检索的,因此 ID_TOKEN 变量有时为空。我尝试使用
强制线程等待任务Tasks.await(任务)
但是我得到一个异常,说 await 不能在主线程中调用。
有没有其他方法可以同步获取 token ,或者让线程等待任务完成?
最佳答案
我现在是这样做的:
private suspend fun getTokenResult (firebaseUser: FirebaseUser) = suspendCoroutine<GetTokenResult?> { continuation ->
firebaseUser.getIdToken(true).addOnCompleteListener {
if (it.isSuccessful) {
continuation.resume(it.result)
} else {
continuation.resume(null)
}
}
使用挂起函数和延续机制。因此,如果您正在使用 Coroutines
,这可能是最简单的方法
关于android - 同步获取 Firebase 用户 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48817725/