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