Tema
/
Mobiliosios programėlės KOTLIN
Pamoka 9 / 14 Autentifikacija II: Google ~45 min

Sukurk google.go — serveris tikrina Google raktą

Google raktą niekada nepasitikim aklai — jį patikrina serveris. Kodo stulpelyje — backendo auth/google.go. idtoken.Validate atlieka visą sunkų darbą: patikrina Google parašą, aud (turi sutapti su tavo Web kliento ID), exp ir iss. Jei bent kas nesutampa — err, ir mes raktu nepasitikim.

HTTP dalis (handlers.go) — „rask arba sukurk" vartotoją ir išduok mūsų JWT:

func (h *Handler) GoogleAuth(w http.ResponseWriter, r *http.Request) {
    var body struct{ IDToken string `json:"id_token"` }
    json.NewDecoder(r.Body).Decode(&body)

    googleUser, err := VerifyGoogleToken(body.IDToken)   // ← Google patikra
    if err != nil {
        http.Error(w, "invalid google token", http.StatusUnauthorized)  // 401
        return
    }

    // Rask vartotoją pagal el. paštą; nėra — sukurk (Google vartotojas be slaptažodžio)
    user, err := h.queries.GetUserByEmail(r.Context(), googleUser.Email)
    if errors.Is(err, sql.ErrNoRows) {
        user, _ = h.queries.CreateUser(r.Context(), sqlc.CreateUserParams{
            Email: googleUser.Email, PasswordHash: nil,   // nil = tik Google
        })
    }

    token, _ := CreateToken(int(user.ID), user.Email)     // ← MŪSŲ sesijos JWT (kaip 8a)
    writeJSON(w, http.StatusOK, authResponse{Token: token})
}

Rezultatas — { "token": "..." }, identiškas /login atsakymui. Serveris GOOGLE_WEB_CLIENT_ID skaito iš aplinkos (.env lokaliai, Railway produkcijoje).

Spąstai (Web vs Android klientas — dažniausias!). Google Cloud Console duoda du klientų ID. Intuicija sako „naudok Android ID, juk tai Android programa" — klaida. Ir programa (setServerClientId), ir serveris (idtoken.Validate aud) turi naudoti WEB kliento ID. Android klientas tik registruoja tavo parašą; jis nefigūruoja rakto aud lauke. Jei programa paduos Android ID, serveris patikros metu gaus neatitinkantį aud ir mes:

invalid google token: idtoken: audience provided does not match aud claim in the JWT

Taisyklė: abi pusės — Web kliento ID. Android klientas turi egzistuoti (su teisingu SHA-1), bet kode jo ID nenaudoji.