Tas pats raktas, kitos durys
8a pamokoje sukūrėm sesijos rakto kontraktą: serveris išduoda vieną JWT, klientas jį saugo ir siunčia. Google prisijungimas nekuria naujo kontrakto — jis tik prideda dar vieną būdą gauti tą patį raktą.
Palygink du kelius:
El. paštas (8a): el.paštas+slaptažodis ─▶ POST /login ─▶ mūsų JWT
Google (8b): Google ID raktas ─▶ POST /auth/google ─▶ mūsų JWT (tas pats!)
Nuo tos vietos programa nemato skirtumo — SecureTokenStorage, AuthInterceptor, užsakymai (9 pamoka) veikia vienodai, nesvarbu, kaip prisijungei. Tai ir yra pamokos esmė: tas pats raktas, kitos durys.
Pilnas Google srautas:
1. Programa: Credential Manager parodo Google paskyrų pasirinkimą
2. Vartotojas pasirenka paskyrą → Google grąžina "ID token" (pasirašytą JWT)
3. Programa siunčia ID token → POST /auth/google
4. Serveris patikrina jį su Google (parašas, aud, exp) → idtoken.Validate
5. Serveris randa/sukuria vartotoją → išduoda MŪSŲ sesijos JWT
6. Programa saugo tą JWT — lygiai kaip 8a
Google ID token ≠ mūsų sesijos raktas. Google raktas tik įrodo „Google patvirtina, kad tai vartotojas X". Mes juo pasitikime tik po patikros serveryje, ir tada išduodam savo raktą. Klientas niekada tiesiogiai nesijungia į mūsų DB su Google raktu.
Konsolės paruošimas (Google Cloud Console). Prieš rašant kodą reikia dviejų OAuth klientų:
- Android klientas — susietas su tavo programos paketo vardu (
eif.viko.lt.pica) ir debug SHA-1 parašu. Jis leidžia telefonui iš viso gauti Google raktą. - Web klientas — jo ID naudoja IR programa (
setServerClientId), IR serveris (kaipaud, kurį tikrina). Tai — dažniausio spąsto šaltinis, apie kurį kalbėsim.
Verify-docs. Naudojam Credential Manager (
androidx.credentials+ „Sign in with Google") — dabartinį API. SenasisGoogleSignInClientyra pasenęs (deprecated) — nerašyk prieš jį.