Koin network module SharedPreferences не обновляется значение
По логину и паролю делаю запрос на сервер и в ответ получаю токен, который сохраняю в SharedPreferences. После этого перехожу на другой экран и пытаюсь запросить данные, но получаю 401 из-за того, что токен отсутствует. Обновляется значение в SharedPreferences в NetworkModule только после перезапуска приложения. Мне необходимо его получить в текущем запуске приложения и выполнить запрос сразу после авторизации. Поэтому передаю экземпляр SharedPreferences в AuthInterceptor.
val sharedPreferencesModule = module {
single { androidApplication().getSharedPreferences(sharedPreferences, Context.MODE_PRIVATE) }
}
val networkModule = module {
fun provideRetrofit(factory: Gson, client: OkHttpClient, sharedPreferences: SharedPreferences): Retrofit {
val logging = if (BuildConfig.DEBUG) {
HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
} else {
HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)
}
return Retrofit.Builder()
.baseUrl(BuildConfig.SERVER_URL)
.addConverterFactory(GsonConverterFactory.create(factory))
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.client(
client.newBuilder()
.addInterceptor(logging)
.addInterceptor(AuthInterceptor(sharedPreferences.getString("auth_token","")))
.build()
)
.build()
}
single {
provideRetrofit(
get(),
get(),
androidApplication()
.getSharedPreferences(
sharedPreferences,
Context.MODE_PRIVATE
)
)
}
}
class AuthInterceptor(var token: String? = null) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val authHeader = chain.request().header("Authorization")
val request: Request = if (authHeader.isNullOrEmpty() && !token.isNullOrEmpty()) {
chain.request().newBuilder()
.addHeader("Authorization", "Bearer $token")
.build()
} else {
chain.request()
}
return chain.proceed(request)
}
}
Ответы (1 шт):
Eugene Krivenja подсказал найти решение в другом месте. Например, я нашёл такой вариант, который работает, где token - "Bearer $token". При такой реализации приходится в каждый запрос пробрасывать токен в качестве аргумента.
@GET("api/users/")
suspend fun getUsers(@Header("Authorization") token:String): JsonObject