Tema
/
Mobiliosios programėlės KOTLIN
Pamoka 10 / 14 Autentifikuotos užklausos ~45 min

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 /login ir /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ėl publicPaths sąrašas privalomas — jis šiuos kelius praleidžia be antraštės.