SSO Login - Component Documentation
SSO login adalah implementasi authentication menggunakan protokol OIDC (OpenID Connect). Dokumentasi ini menjelaskan bagaimana komponen di frontend dan backend bekerja sama untuk handle login.
Alur Login
Frontend Implementation
OIDC Configuration
File: src/hooks/oidc.ts
const oidcConfig = {
authority: VITE_OIDC_AUTHORITY,
client_id: VITE_OIDC_CLIENT_ID,
redirect_uri: VITE_OIDC_REDIRECT_URI,
response_type: VITE_OIDC_RESPONSE_TYPE,
scope: VITE_OIDC_SCOPE,
post_logout_redirect_uri: VITE_OIDC_POST_LOGOUT_REDIRECT_URI,
userStore: new WebStorageStateStore({ store: window.localStorage }),
};
Setiap variable punya peran:
authority- URL SSO serverclient_id- ID yang terdaftar di SSOredirect_uri- URL callback setelah login di SSOscope- Apa aja data yang diminta (openid, profile, email, dll)
Login Function
export function LoginOIDC() {
userManager.signinRedirect();
}
Fungsi ini trigger redirect ke SSO login page.
Callback Handler
File: src/hooks/callback.tsx
Handler ini dijalankan pas user di-redirect balik dari SSO:
// 1. Parse token dari URL
const userManager = new UserManager(oidcConfig);
const user = await userManager.signinCallback();
// 2. Kirim ke backend buat ditukar dengan app token
const response = await fetch('/auth/login-sso', {
method: 'POST',
body: JSON.stringify({
id_token: user.id_token,
access_token: user.access_token,
profile: user.profile
})
});
// 3. Simpan app token
const loginData = await response.json();
login(loginData);
// 4. Redirect ke home
navigate('/');
Backend Implementation
Login Endpoint
File: backend-user-service/routes/auth/route.go
POST /auth/login-sso
Request:
{
"id_token": "eyJhbGciOi...",
"access_token": "eyJhbGciOi...",
"profile": {
"email": "user@example.com",
"name": "John Doe",
"sub": "user-123"
}
}
Response:
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user_id": "550e8400-e29b-41d4-a716",
"name": "John Doe",
"email": "user@example.com",
"user_groups": ["admin", "developer"],
"attributes": {
"department": "IT",
"position": "Engineer"
}
}
Plus cookie access_token dengan HTTPOnly flag.
Backend Processing
Backend melakukan:
- Check user - Cari user di database berdasarkan email
- Buat user baru - Kalau belum ada (first time login)
- Ambil attributes - Query user groups dan attributes
- Generate token - Buat JWT token aplikasi dengan data user
- Set cookie - Simpan token di cookie HTTPOnly (30 hari expire)
Token Management
SSO Token
Token dari SSO server (hanya temporary):
id_token- Identity token (JWT)access_token- Access token SSO
Dipakai hanya untuk exchange dengan app token. Setelah itu di-discard.
Application Token
Token dari backend aplikasi (yang dipakai terus):
- Berisi user_id, email, groups, attributes
- JWT format
- Expire 24 jam di backend
- Disimpan di:
- Cookie HTTPOnly (expire 30 hari)
- localStorage via AuthContext
Token ini dipakai untuk semua request ke backend selanjutnya.
Environment Variables
VITE_OIDC_AUTHORITY=https://sso.example.com
VITE_OIDC_CLIENT_ID=my-app-client
VITE_OIDC_REDIRECT_URI=https://app.example.com/callback
VITE_OIDC_RESPONSE_TYPE=code
VITE_OIDC_SCOPE=openid profile email
VITE_OIDC_POST_LOGOUT_REDIRECT_URI=https://app.example.com
VITE_OIDC_REDIRECT_URI sangat penting - ini adalah callback URL yang akan di-hit SSO pas user login berhasil.
Security Notes
- SSO token tidak disimpan lama di frontend, langsung ditukar dengan app token
- App token disimpan di cookie HTTPOnly biar aman dari XSS
- Backend validasi setiap request pake app token
- Kalau app token expired, user harus login ulang via SSO
- Cookie punya HTTPOnly + Secure flag buat extra protection