android - 同步获取 Firebase 用户 token

标签 android firebase firebase-authentication

我正在尝试获取一个 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/

相关文章:

android - Gradle同步问题错误:任务 ':app:mergeDebugResources'的执行失败

android - Firebase/Facebook 身份验证 - OAuthException - 代码 190

c# - dot42/xamarin Android编程及应用AlertDialog的SetOnCancelListener方法

android - 如何使用android应用程序捕获http请求

javascript - 在 HTML 网页中显示 Firebase 记录

生产应用的 Firebase CRUD 操作限制

swift - firebase swift -- 用户查询

javascript - Express Js Firebase SignOut() 立即向客户端 Fetch Post 请求返回状态 200

android - 为什么具有 30 个元素的 ViewPager 和 GridLayout 非常慢?

firebase - 如何向 Firebase 添加额外的用户信息