Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将带有Firebase ID令牌的改装服务注入kodein_Android_Firebase_Retrofit2_Kotlin Coroutines_Kodein - Fatal编程技术网

Android 如何将带有Firebase ID令牌的改装服务注入kodein

Android 如何将带有Firebase ID令牌的改装服务注入kodein,android,firebase,retrofit2,kotlin-coroutines,kodein,Android,Firebase,Retrofit2,Kotlin Coroutines,Kodein,我正在尝试将服务注入到。API服务使用Firebase身份验证令牌进行身份验证。因此,我必须通过从Firebase auth.getInstance().getIdToken()获取令牌,将请求头中的id令牌作为基本身份验证传递给任务回调中的令牌。现在我面临的问题是我必须将令牌传递给http客户端请求拦截器。我想不出怎么做 我已经看了一些解决方案的例子。但我是科特林公司的新手,没能学到多少东西 这是我的Kodian对象 override val kodein by Kodein.lazy {

我正在尝试将服务注入到。API服务使用Firebase身份验证令牌进行身份验证。因此,我必须通过从Firebase auth.getInstance().getIdToken()获取令牌,将请求头中的id令牌作为基本身份验证传递给任务回调中的令牌。现在我面临的问题是我必须将令牌传递给http客户端请求拦截器。我想不出怎么做

我已经看了一些解决方案的例子。但我是科特林公司的新手,没能学到多少东西

这是我的Kodian对象

override val kodein by Kodein.lazy {
    import(androidXModule(this@App))
    bind() from singleton { FirebaseDatabase.getInstance() }
    bind<ApiService>() from singleton {  RetrofitFactory.makeApiService() }
}
我可能完全弄错了,或者有更好的方法

感谢您的帮助

提前谢谢。

我找到了解决办法

创建一个
TokenProvider
,如下所示

class TokenProvider {

    private var token: String = ""

    fun get() = token

    fun load() {
        getToken {
            token = it
        }
    }

    private fun getToken(callback: (String) -> Unit) {
        FirebaseAuth.getInstance().currentUser?.getIdToken(true)?.addOnCompleteListener {
            if (it.isSuccessful){
                callback(it.result?.token!!)
            }
        }
    }
} 
在kodein中注入
令牌提供者

override val kodein by Kodein.lazy {
    import(androidXModule(this@App))
    bind() from singleton { TokenProvider() }
    bind<ApiService>() with singleton { RetrofitFactory.makeApiService(instance()) }
}
最后,在App
onCreate

override fun onCreate() {
    super.onCreate()
    val tokenProvider by instance<TokenProvider>()
    tokenProvider.load()
}
override-fun-onCreate(){
super.onCreate()
val tokenProvider(按实例)()
tokenProvider.load()文件
}
此解决方案存在一个边缘情况。如果您在应用加载后立即调用Api。到那时,如果firebase令牌未加载。那么Api调用将失败


这对我很有用,因为我不会在应用程序加载时调用Api。仍在寻找解决此边缘问题的解决方案。一个解决方法是在调用Api之前等待令牌加载。

Hello Varun,您找到完整的解决方案了吗?
object RetrofitFactory {

    fun makeApiService(tokenProvider: TokenProvider): ApiService {

        val token = tokenProvider.get()

        val client = OkHttpClient.Builder()
                .addInterceptor {
                    val request = it.request()
                            .newBuilder()
                            .addHeader("authorization", "Bearer $token")
                            .build()
                    it.proceed(request)
                }
                .build()

        return Retrofit.Builder()
                .baseUrl(BuildConfig.BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(ApiService::class.java)
    }
}
override fun onCreate() {
    super.onCreate()
    val tokenProvider by instance<TokenProvider>()
    tokenProvider.load()
}