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:
- Resource Owner — user yang punya data (kamu)
- Client — aplikasi yang ingin mengakses data (app edit foto)
- Authorization Server — yang mengeluarkan token (Google Auth)
- Resource Server — yang menyimpan data (Google Photos API)
Authorization Code Flow (paling aman untuk web app):
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.