SSO (Single Sign-On) memungkinkan user login sekali dan otomatis terautentikasi di banyak aplikasi. Ini standar di lingkungan enterprise.
Konsep utama:
- IdP (Identity Provider) — penyedia identitas, mengelola login user (contoh: Okta, Azure AD, Google Workspace)
- SP (Service Provider) — aplikasi yang butuh autentikasi (contoh: Slack, Salesforce, aplikasi internal)
- Assertion — pernyataan terverifikasi tentang identitas user yang dikirim IdP ke SP
Protokol SSO populer:
- SAML 2.0 — standar enterprise berbasis XML, dipakai aplikasi legacy dan korporat besar
- OIDC (OpenID Connect) — modern, berbasis JSON/JWT, dipakai aplikasi web/mobile
- CAS — dipakai banyak universitas
Alur SAML 2.0 (SP-Initiated):
1. User buka app.perusahaan.com/dashboard (SP)
2. SP: "Kamu belum login, redirect ke IdP"
→ Redirect ke idp.perusahaan.com/sso?SAMLRequest=...
3. IdP tampilkan halaman login
4. User login dengan kredensial perusahaan
5. IdP buat SAML Assertion (XML, ditandatangani digital):
<Assertion>
<Subject>[email protected]</Subject>
<Attribute name="role">editor</Attribute>
<Attribute name="department">engineering</Attribute>
<Conditions NotBefore="..." NotOnOrAfter="..."/>
</Assertion>
6. IdP POST assertion ke SP (ACS URL): app.perusahaan.com/saml/callback
7. SP validasi signature assertion
8. SP buat session lokal → user masuk!
User buka crm.perusahaan.com (SP kedua):
9. SP cek: user sudah login di IdP? Ya!
10. IdP kirim assertion baru ke CRM → user langsung masuk tanpa login ulang
Implementasi SAML di Node.js:
const saml = require("@node-saml/node-saml");
const samlConfig = {
entryPoint: "https://idp.example.com/sso",
issuer: "https://myapp.example.com",
cert: "CERTIFICATE_FROM_IDP",
callbackUrl: "https://myapp.example.com/saml/callback"
};
// Redirect ke IdP
app.get("/login/saml", (req, res) => {
saml.getAuthorizeUrlAsync(samlConfig).then((url) => res.redirect(url));
});
// Callback dari IdP
app.post("/saml/callback", async (req, res) => {
const { profile } = await saml.validatePostResponseAsync(samlConfig, req.body);
// profile.nameID = email user
// profile berisi semua attribute dari assertion
req.session.userId = profile.nameID;
res.redirect("/dashboard");
});
SAML vs OIDC:
| Aspek | SAML 2.0 | OIDC |
|---|---|---|
| Format | XML | JSON/JWT |
| Usia | 2005 | 2014 |
| Kompleksitas | Tinggi | Sederhana |
| Mobile support | Buruk | Sangat baik |
| Enterprise adoption | Dominan | Meningkat |
Kapan pakai SSO: sistem enterprise dengan banyak internal tools, onboarding/offboarding karyawan (satu tempat kelola akses), compliance dan audit terpusat.