api/docs/technical/google-auth.md

2.6 KiB

Google Auth - Backend

Endpoint

POST /v1/auth/google-login

Request

{
  "credential": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Response (200)

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "bearer",
  "user": {
    "id": "uuid",
    "email": "user@gmail.com",
    "username": "user",
    "tenant_id": null,
    "status": "ACTIVE",
    "created_at": "...",
    "profile": {
      "full_name": "User Name",
      "phone": null,
      "timezone": "Asia/Jakarta"
    }
  }
}

Error Responses

Status Detail
401 Kredensial Google tidak valid atau telah kedaluwarsa.
401 Tidak dapat mengambil email dari akun Google.

Logic

  1. Verify JWT token dari Google via google.oauth2.id_token.verify_oauth2_token() dengan GOOGLE_CLIENT_ID
  2. Extract email dan name dari token payload
  3. Cari user by email di database
  4. Jika user belum ada:
    • Generate username dari email prefix (jika duplicate, tambah suffix angka: user, user2, user3...)
    • Generate random 32-char password (tidak pernah dipakai)
    • Set email_verified_at = now (Google sudah verifikasi)
    • Set status = ACTIVE
    • Buat UserProfile dengan full_name dari Google
  5. Jika user sudah ada:
    • Update email_verified_at jika belum terisi
    • Update full_name jika berubah
    • Create profile jika belum ada
  6. Return JWT access token + user detail

Schema

class GoogleLoginRequest(BaseModel):
    credential: str

Config

Environment Variable

# api/.env
GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com

Settings

# api/app/config.py
class Settings(BaseSettings):
    GOOGLE_CLIENT_ID: str = ""

Dependencies

google-auth==2.56.2

Ditambahkan ke api/requirements.txt.


Files Changed

File Change
api/app/config.py Tambah GOOGLE_CLIENT_ID: str = ""
api/.env Tambah GOOGLE_CLIENT_ID=xxx
api/app/schemas/user.py Tambah GoogleLoginRequest schema
api/app/routers/auth.py Tambah endpoint POST /v1/auth/google-login + imports
api/requirements.txt Tambah google-auth==2.56.2

Design Decisions

  • Tidak pakai kolom google_id - User matching pakai email dari Google token, tidak perlu kolom baru di DB
  • Password field tetap NOT NULL - Google user dapat random password hash (tidak pernah dipakai)
  • Auto-verify email - email_verified_at langsung diisi karena Google sudah verifikasi email
  • Status langsung ACTIVE - Tidak perlu alur onboarding untuk Google user