Sukurk AuthInterceptor.kt — žetonas ant kiekvienos užklausos
Kodo stulpelyje — AuthInterceptor.kt. Jis įgyvendina Interceptor sąsają: intercept() gauna kiekvieną užklausą, patikrina kelią, ir jei jis ne viešas — prideda Authorization: Bearer <žetonas>. Žetoną paima iš TokenStorage (8a).
Dabar interceptorių reikia įjungti į tinklą. Prisimink 6 pamokos coreModule — jis turėjo tik Retrofit ir PicaApi. Dabar jis paauga iki tikros formos: OkHttpClient su interceptoriumi, o Retrofit jį naudoja:
// coreModule — pridedam OkHttp su auth
single<OkHttpClient> {
OkHttpClient.Builder()
.addInterceptor(AuthInterceptor(get())) // get() = TokenStorage (8a)
.addInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY // matai užklausas Logcat'e
})
.build()
}
single<Retrofit> {
Retrofit.Builder()
.baseUrl("http://10.0.2.2:8080/")
.client(get()) // ← naudok OkHttp su auth
.addConverterFactory(get<Json>().asConverterFactory("application/json".toMediaType()))
.build()
}
Viena eilutė — .client(get()) — ir kiekviena Retrofit užklausa dabar eina per interceptorių. Nė vienas ViewModel ar repozitorija nesikeičia.
Patikrink. Prisijunk, tada Logcat'e (HttpLoggingInterceptor) pažiūrėk apsaugotą užklausą — turi matyti antraštę:
--> GET http://10.0.2.2:8080/orders
Authorization: Bearer eyJhbGciOi...
O --> POST http://10.0.2.2:8080/login antraštės neturi — nes tai viešas kelias.
Spąstai (višta ir kiaušinis). Jei interceptorius neatmeta
/loginir/register, jis bandys prisegti žetoną ir prie prisijungimo užklausos. Bet jungiantis žetono dar nėra (arba jis pasibaigęs) — ir serveris grąžins 401. Rezultatas: negali prisijungti, kad gautum žetoną, nes prisijungimui reikia... žetono. Užburtas ratas. TodėlpublicPathssąrašas privalomas — jis šiuos kelius praleidžia be antraštės.