Sukurk GoogleSignInHelper.kt — Google ID raktas
Kodo stulpelyje — GoogleSignInHelper.kt. Viena suspend funkcija: CredentialManager parodo Google paskyrų pasirinkimą, ir jei vartotojas pasirenka — grąžina ID token (pasirašytą JWT). Atkreipk dėmesį į setServerClientId(...google_web_client_id) — čia paduodam Web kliento ID, ne Android.
Pridėk priklausomybes ir strings.xml:
implementation(libs.androidx.credentials)
implementation(libs.androidx.credentials.play.services.auth)
implementation(libs.googleid) // GetGoogleIdOption
<!-- res/values/strings.xml -->
<string name="google_web_client_id">1001517404205-...apps.googleusercontent.com</string>
Toliau — tas pats kontraktas kaip 8a. PicaApi gauna endpoint'ą:
@POST("auth/google")
suspend fun googleAuth(@Body request: GoogleAuthRequest): AuthResponse // ← ta pati AuthResponse!
@Serializable data class GoogleAuthRequest(@SerialName("id_token") val idToken: String)
AuthRepository — nauja funkcija, saugojanti raktą į tą pačią saugyklą:
suspend fun googleSignIn(idToken: String) {
val response = api.googleAuth(GoogleAuthRequest(idToken))
tokenStorage.saveToken(response.token) // ta pati saugykla kaip el. paštas
}
AuthViewModel — googleSignIn(idToken) atkartoja authenticate() logiką (isLoading, isLoggedIn, error). O LoginScreen — mygtukas po „arba" skirtuku:
OutlinedButton(
onClick = {
scope.launch {
try {
val idToken = getGoogleIdToken(context)
if (idToken != null) viewModel.googleSignIn(idToken)
} catch (e: Exception) {
// vartotojas uždarė pasirinkimą arba nėra paskyrų — ignoruojam
}
}
},
enabled = !state.isLoading,
modifier = Modifier.fillMaxWidth()
) { Text("Sign in with Google") }
Patarimas.
setFilterByAuthorizedAccounts(false)— parodo visas telefono Google paskyras (ne tik anksčiau naudotas su šia programa).truenaudinga „grįžtantiems" vartotojams (tylesnis srautas), bet pirmam prisijungimui reikiafalse.