Login via SSO
Endpoint ini digunakan untuk autentikasi user melalui SSO (Single Sign-On) menggunakan protokol OIDC.
Flow Login
Endpoint
POST /auth/login-sso
Request Body
{
"id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6...",
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6...",
"profile": {
"email": "user@example.com",
"name": "John Doe",
"sub": "123456789"
}
}
Response
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user_id": "550e8400-e29b-41d4-a716-446655440000",
"name": "John Doe",
"email": "user@example.com",
"user_groups": ["admin", "developer"],
"attributes": {
"department": "IT",
"position": "Engineer"
}
}
Response juga menyertakan cookie access_token dengan flag HTTPOnly dan masa berlaku 30 hari.
Komponen
Frontend - OIDC Config
File: Frontend/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 }),
};
Fungsi untuk trigger login:
export function LoginOIDC() {
userManager.signinRedirect();
}
Frontend - Callback Handler
File: Frontend/src/hooks/callback.tsx
Setelah SSO redirect balik ke aplikasi, callback handler akan:
- Parse token dari URL via
userManager.signinCallback() - Ambil user object dari response SSO
- Kirim data ke
POST /auth/login-sso - Simpan token aplikasi via
login()dari AuthContext - Redirect ke halaman utama
Backend - Login Handler
File: backend-user-service/routes/auth/route.go
Proses di backend:
- Terima object
UserSSOdari frontend - Cari user di database berdasarkan email
- Kalau user belum ada, buat user baru
- Generate JWT token aplikasi
- Set cookie
access_token - Return token beserta data user
Environment Variables
| Variable | Deskripsi | Contoh |
|---|---|---|
VITE_OIDC_AUTHORITY | URL SSO server | https://sso.example.com |
VITE_OIDC_CLIENT_ID | Client ID yang terdaftar di SSO | my-app-client |
VITE_OIDC_REDIRECT_URI | URL callback setelah login | https://app.example.com/callback |
VITE_OIDC_RESPONSE_TYPE | Tipe response OIDC | code |
VITE_OIDC_SCOPE | Scope yang diminta | openid profile email |
VITE_OIDC_POST_LOGOUT_REDIRECT_URI | URL redirect setelah logout | https://app.example.com |
Token
Ada 2 jenis token yang digunakan:
SSO Token
Token yang didapat dari SSO server, terdiri dari:
id_token- berisi identity user (JWT)access_token- untuk akses resource di SSO
Token ini hanya dipakai sekali untuk ditukar dengan application token.
Application Token
Token yang dihasilkan backend aplikasi, berisi:
user_idemailuser_groupsattributes
Disimpan di:
- Cookie dengan flag HTTPOnly (expire 30 hari)
- localStorage via AuthContext (expire 24 jam)
Token ini yang dipakai untuk semua request ke backend selanjutnya.
Security
- SSO token tidak disimpan di frontend, hanya dipakai untuk exchange
- Application token disimpan di cookie HTTPOnly untuk mencegah XSS
- Backend memvalidasi token di setiap request
- Token expire 24 jam, cookie expire 30 hari
- Kalau token expired, user harus login ulang via SSO