Skip to main content

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 server
  • client_id - ID yang terdaftar di SSO
  • redirect_uri - URL callback setelah login di SSO
  • scope - 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:

  1. Check user - Cari user di database berdasarkan email
  2. Buat user baru - Kalau belum ada (first time login)
  3. Ambil attributes - Query user groups dan attributes
  4. Generate token - Buat JWT token aplikasi dengan data user
  5. 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