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.Validateaud) turi naudoti WEB kliento ID. Android klientas tik registruoja tavo parašą; jis nefigūruoja raktoaudlauke. Jei programa paduos Android ID, serveris patikros metu gaus neatitinkantįaudir mes:invalid google token: idtoken: audience provided does not match aud claim in the JWTTaisyklė: abi pusės — Web kliento ID. Android klientas turi egzistuoti (su teisingu SHA-1), bet kode jo ID nenaudoji.