Implementasi OAuth2 dan OpenID Connect: Panduan Lengkap untuk Developer Modern
Di era aplikasi terdistribusi dan microservices, autentikasi serta otorisasi menjadi fondasi keamanan yang tidak bisa ditawar. OAuth2 dan OpenID Connect (OIDC) adalah dua protokol standar industri yang wajib dikuasai setiap developer. OAuth2 berfokus pada authorization (delegasi akses), sementara OIDC dibangun di atasnya untuk menangani authentication (identitas pengguna). Artikel ini membahas implementasi keduanya secara praktis, lengkap dengan contoh kode dan analisis keamanan.
Pendahuluan: Mengapa OAuth2 dan OIDC?
Bayangkan aplikasi Anda ingin mengakses kalender Google pengguna tanpa mengetahui password mereka. OAuth2 menyelesaikan masalah ini melalui access token terbatas. OIDC melengkapinya dengan ID Token berformat JWT yang membuktikan identitas pengguna. Kombinasi keduanya menjadi standar de facto untuk Single Sign-On (SSO) modern.
Pembahasan: Alur Kerja Dasar
Alur yang paling aman adalah Authorization Code Flow with PKCE (Proof Key for Code Exchange). Alurnya: aplikasi mengarahkan pengguna ke authorization server, pengguna login dan menyetujui scope, server mengembalikan authorization code, lalu aplikasi menukarkannya dengan token menggunakan code verifier.
Contoh Implementasi
Berikut contoh sederhana menggunakan Node.js dan library openid-client:
const { Issuer, generators } = require('openid-client');
(async () => {
const googleIssuer = await Issuer.discover('https://accounts.google.com');
const client = new googleIssuer.Client({
client_id: 'CLIENT_ID',
client_secret: 'CLIENT_SECRET',
redirect_uris: ['https://app.local/callback'],
response_types: ['code']
});
const codeVerifier = generators.codeVerifier();
const codeChallenge = generators.codeChallenge(codeVerifier);
const authUrl = client.authorizationUrl({
scope: 'openid email profile',
code_challenge: codeChallenge,
code_challenge_method: 'S256'
});
console.log('Buka URL:', authUrl);
})();
Setelah menerima callback dengan parameter code, tukarkan menjadi token:
const tokenSet = await client.callback(
'https://app.local/callback',
{ code: req.query.code },
{ code_verifier: codeVerifier }
);
console.log('Access Token:', tokenSet.access_token);
console.log('ID Token claims:', tokenSet.claims());
Analisis Keamanan: Celah Umum pada OAuth2
Salah satu celah paling berbahaya adalah Authorization Code Interception pada aplikasi mobile tanpa PKCE. Penyerang yang berhasil mencegat authorization code bisa menukarkannya menjadi token jika tidak ada code verifier. Celah lain adalah Open Redirect pada parameter redirect_uri yang tidak divalidasi ketat.
Demonstrasi skenario: penyerang mendaftarkan redirect_uri=https://attacker.com saat memulai flow. Jika authorization server menerima wildcard seperti https://app.local/*, penyerang bisa memakai https://app.local.attacker.com untuk mencuri code.
Cara Pencegahan
- Wajibkan PKCE (S256) untuk semua public client, bukan hanya mobile.
- Validasi redirect_uri secara exact match, tanpa wildcard.
- Verifikasi parameter
stateuntuk mencegah CSRF. - Validasi JWT signature dan claims (iss, aud, exp) pada ID Token.
- Gunakan HTTPS di semua endpoint dan rotasi refresh token.
- Simpan token di HttpOnly cookie atau secure storage, bukan localStorage.
Kesimpulan
OAuth2 dan OpenID Connect adalah tulang punggung autentikasi modern, namun implementasi yang salah dapat membuka celah kritis. Kunci suksesnya adalah: gunakan Authorization Code Flow with PKCE, validasi redirect_uri dan state secara ketat, serta perlakukan ID Token sebagai data sensitif yang harus diverifikasi. Dengan mengikuti praktik ini, aplikasi Anda tidak hanya aman tetapi juga siap diintegrasikan ke ekosistem identity provider mana pun.