Before SSO, our team was dealing with the classic enterprise problem: every tool had its own credentials. Password reuse was rampant. Offboarding was manual and error-prone — deprovisioning access meant logging into each service individually. The security risk was obvious, but so was the daily productivity drain.
Understanding SSO
Single Sign-On is an authentication method that lets users access multiple applications with a single set of login credentials. Instead of maintaining separate passwords for each tool, a user authenticates once against a central identity provider, and that session is trusted by all connected applications.
The two dominant protocols you'll encounter are SAML 2.0 (older, XML-based, widely supported by enterprise software) and OIDC/OAuth 2.0 (modern, JSON/JWT-based, preferred for web applications and APIs). We used both — legacy tools needed SAML, newer services used OIDC.
Why we needed it
- Password overload — engineers maintaining 10+ sets of credentials for internal tools
- Security risk — shared and reused passwords across services
- Productivity loss — time spent on password resets and login flows
- Compliance requirements — audit logs needed to show who accessed what and when
- Offboarding risk — departing employees retained access until manual deprovisioning
Our implementation journey
We broke the implementation into phases to avoid disrupting ongoing work. Phase one was a full audit: cataloguing every internal application, its authentication method, and whether it supported SAML or OIDC. This took longer than expected — there were more tools than anyone had a complete list of.
Phase two was selecting the identity provider. We evaluated Keycloak (self-hosted, open source), Okta (SaaS, mature), and Authentik (self-hosted, modern). We chose Keycloak for the control it gives over data residency and the flexibility to add custom flows without vendor lock-in.
# keycloak helm deployment
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install keycloak bitnami/keycloak \
--set auth.adminUser=admin \
--set auth.adminPassword=${ADMIN_PASSWORD} \
--set postgresql.enabled=truePhase three was integration — connecting applications one by one, starting with the lowest-risk internal tools before touching anything customer-facing. We built a rollback plan for each integration before enabling it.
Results
The impact was immediate and measurable. Onboarding new engineers dropped from a half-day of account provisioning to a single Keycloak user creation. Offboarding became instant — one account disabled, access revoked everywhere simultaneously. Support tickets related to password resets dropped to near zero.
- Onboarding time reduced significantly — one identity, all tools
- Offboarding is now instant and complete
- Full audit log of authentication events across all applications
- Compliance requirements met without additional tooling
- Engineers report noticeably less friction in day-to-day work