OAuth 2.0 Flow — Auth

OAuth 2.0 adalah framework otorisasi yang memungkinkan aplikasi pihak ketiga mendapat akses terbatas ke resource pengguna tanpa mengetahui password mereka. Anal

OAuth 2.0 adalah framework otorisasi yang memungkinkan aplikasi pihak ketiga mendapat akses terbatas ke resource pengguna tanpa mengetahui password mereka.

Analogi: Kamu ingin aplikasi edit foto mengakses foto kamu di Google Photos. Daripada memberikan password Google, kamu memberikan "kunci khusus" (token) yang hanya bisa akses foto, bukan email atau kontak.

Empat peran dalam OAuth:

  1. Resource Owner — user yang punya data (kamu)
  2. Client — aplikasi yang ingin mengakses data (app edit foto)
  3. Authorization Server — yang mengeluarkan token (Google Auth)
  4. Resource Server — yang menyimpan data (Google Photos API)

Authorization Code Flow (paling aman untuk web app):

<title id="oauth-t">Diagram OAuth 2.0 Authorization Code Flow antara User, App (client), dan Google (auth server).</title>UserApp (Client)Google (Auth Server)1. Klik "Login with Google"2. Redirect ke /authorize (+state+PKCE)3. Google tampilkan login + consent4. User approve akses5. Redirect app/callback?code=...6. POST /token { code, client_secret }7. { access_token, refresh_token }8. User logged in
Code di URL (browser-visible), token di server-to-server (hidden). Dua langkah = aman.
1. User klik "Login dengan Google" di app kamu
2. App redirect ke Google:
   https://accounts.google.com/authorize?
     response_type=code&
     client_id=APP_ID&
     redirect_uri=https://myapp.com/callback&
     scope=profile email&
     state=random123

3. User login di Google dan setujui akses
4. Google redirect ke callback URL app kamu:
   https://myapp.com/callback?code=AUTH_CODE&state=random123

5. Server app kamu tukar authorization code dengan token:
   POST https://oauth2.googleapis.com/token
   { code, client_id, client_secret, redirect_uri, grant_type }

6. Google kirim:
   { access_token: "...", refresh_token: "...", expires_in: 3600 }

7. App pakai access_token untuk akses Google API

Mengapa 2 langkah (code → token)? Authorization code dikirim via URL redirect (terlihat di browser). Access token dikirim server-to-server (aman). Ini mencegah token terekspos di browser history atau logs.

Scopes — membatasi akses:

scope=profile email           → hanya profil dan email
scope=read:photos             → hanya baca foto
scope=admin                   → akses penuh (jarang diberikan)

Grant types lainnya:

Grant Type Penggunaan
Authorization Code Web app (paling aman)
Authorization Code + PKCE SPA dan mobile app
Client Credentials Server-to-server (tanpa user)
Device Code Smart TV, IoT device

PKCE (Proof Key for Code Exchange): Untuk SPA dan mobile app yang tidak bisa menyimpan client_secret secara aman, PKCE menambahkan code_verifier dan code_challenge.

// 1. Generate code_verifier (random string)
const verifier = generateRandomString(128);

// 2. Generate code_challenge (SHA256 hash)
const challenge = base64url(sha256(verifier));

// 3. Kirim challenge saat authorize
// 4. Kirim verifier saat tukar code → token
// Server memverifikasi sha256(verifier) === challenge

State parameter: Selalu gunakan state parameter random untuk mencegah CSRF attack. Verifikasi bahwa state yang kembali sama dengan yang dikirim.