Skip to main content

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:

  1. Parse token dari URL via userManager.signinCallback()
  2. Ambil user object dari response SSO
  3. Kirim data ke POST /auth/login-sso
  4. Simpan token aplikasi via login() dari AuthContext
  5. Redirect ke halaman utama

Backend - Login Handler

File: backend-user-service/routes/auth/route.go

Proses di backend:

  1. Terima object UserSSO dari frontend
  2. Cari user di database berdasarkan email
  3. Kalau user belum ada, buat user baru
  4. Generate JWT token aplikasi
  5. Set cookie access_token
  6. Return token beserta data user

Environment Variables

VariableDeskripsiContoh
VITE_OIDC_AUTHORITYURL SSO serverhttps://sso.example.com
VITE_OIDC_CLIENT_IDClient ID yang terdaftar di SSOmy-app-client
VITE_OIDC_REDIRECT_URIURL callback setelah loginhttps://app.example.com/callback
VITE_OIDC_RESPONSE_TYPETipe response OIDCcode
VITE_OIDC_SCOPEScope yang dimintaopenid profile email
VITE_OIDC_POST_LOGOUT_REDIRECT_URIURL redirect setelah logouthttps://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_id
  • email
  • user_groups
  • attributes

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