{"id":51455,"date":"2025-08-11T09:03:49","date_gmt":"2025-08-11T09:03:49","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=51455"},"modified":"2025-08-11T09:03:49","modified_gmt":"2025-08-11T09:03:49","slug":"keyclock-a-identity-sso-tools","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/keyclock-a-identity-sso-tools\/","title":{"rendered":"Keyclock: A Identity &amp; SSO tools"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Keycloak: Identity &amp; SSO Tool (IAM in one box)<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What it is<\/h2>\n\n\n\n<p>Keycloak is an open-source Identity and Access Management (IAM) platform that provides <strong>Single Sign-On (SSO)<\/strong>, <strong>user federation<\/strong>, <strong>identity brokering<\/strong>, and <strong>fine-grained authorization<\/strong> for web, mobile, and APIs. It implements open standards: <strong>OpenID Connect (OIDC)<\/strong>, <strong>OAuth 2.0<\/strong>, and <strong>SAML 2.0<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Core concepts (quick map)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Realm<\/strong>: Isolation boundary (tenants). Users, clients, and roles live inside a realm.<\/li>\n\n\n\n<li><strong>Client<\/strong>: An app (web, SPA, mobile, API) that uses Keycloak for login or token issuing.<\/li>\n\n\n\n<li><strong>Users \/ Groups<\/strong>: Identities and their organization.<\/li>\n\n\n\n<li><strong>Roles<\/strong>: Permissions attached to users\/groups (realm roles) or to specific clients (client roles).<\/li>\n\n\n\n<li><strong>Mappers<\/strong>: Add custom claims (e.g., roles, email) into tokens.<\/li>\n\n\n\n<li><strong>Identity Providers (IdP)<\/strong>: External SSO sources (e.g., Google, Azure AD); Keycloak can <strong>broker<\/strong> them.<\/li>\n\n\n\n<li><strong>Federation<\/strong>: Sync users from LDAP\/AD.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What problems it solves<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Centralized login across many apps (SSO)<\/li>\n\n\n\n<li>Standards-based auth for SPAs, mobile apps, and microservices<\/li>\n\n\n\n<li>RBAC via realm\/client roles in JWTs<\/li>\n\n\n\n<li>Social\/enterprise login without custom code<\/li>\n\n\n\n<li>Admin UI + Admin REST API for automation<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Common architectures<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Web app<\/strong> \u2192 OIDC Authorization Code + PKCE (server session)<\/li>\n\n\n\n<li><strong>SPA + API<\/strong> \u2192 SPA gets tokens from Keycloak; API validates JWT (bearer-only)<\/li>\n\n\n\n<li><strong>Gateway\/Proxy<\/strong> \u2192 oauth2-proxy\/ingress handles OIDC, passes user headers to apps<\/li>\n\n\n\n<li><strong>B2E<\/strong> with LDAP\/AD \u2192 user federation + SSO to internal apps<\/li>\n\n\n\n<li><strong>B2C<\/strong> \u2192 social logins, self-service registration, custom themes<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Why teams choose Keycloak<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Open-source, no per-user fees<\/li>\n\n\n\n<li>Full control: self-hosted (VMs, containers, Kubernetes Operator)<\/li>\n\n\n\n<li>Extensible (themes, custom providers, hooks)<\/li>\n\n\n\n<li>Strong standards support and ecosystem<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Quick start (local)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">docker run -p <span class=\"hljs-number\">8080<\/span>:<span class=\"hljs-number\">8080<\/span> \\\n  -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin \\\n  quay.io\/keycloak\/keycloak:latest start-dev\n<span class=\"hljs-comment\"># Admin console: http:\/\/localhost:8080<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\">\n<li>Create a <strong>realm<\/strong><\/li>\n\n\n\n<li>Add a <strong>client<\/strong> (e.g., your app)<\/li>\n\n\n\n<li>Configure <strong>redirect URIs<\/strong> and <strong>web origins<\/strong><\/li>\n\n\n\n<li>Create <strong>users\/roles<\/strong> and add <strong>mappers<\/strong> for roles \u2192 tokens<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Integration patterns (at a glance)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Laravel (SSR)<\/strong>: OIDC Authorization Code + PKCE via Socialite + Keycloak provider; map Keycloak user \u2192 local user; optional SSO logout via end_session endpoint.<\/li>\n\n\n\n<li><strong>Laravel API<\/strong>: Bearer-only; validate JWT signature via realm JWKS; read roles from <code>realm_access<\/code> \/ <code>resource_access<\/code>.<\/li>\n\n\n\n<li><strong>Node\/React\/Vue<\/strong>: Use official Keycloak JS adapter or generic OIDC libraries.<\/li>\n\n\n\n<li><strong>Kubernetes<\/strong>: Run Keycloak via Operator; front apps with oauth2-proxy or Envoy\/OIDC filter.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Security &amp; ops checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enforce <strong>PKCE<\/strong> and <strong>HTTPS<\/strong> everywhere<\/li>\n\n\n\n<li>Rotate admin creds; restrict admin console access<\/li>\n\n\n\n<li>Set token lifetimes and reuse detection; enable <strong>Front-Channel Logout<\/strong> if needed<\/li>\n\n\n\n<li>Back up realm exports; use Infrastructure-as-Code for realms\/clients<\/li>\n\n\n\n<li>Monitor with health endpoints; scale with stateless pods + external DB<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Theming &amp; UX<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Customize login\/registration\/forgot-password pages with themes<\/li>\n\n\n\n<li>Localize strings; inject branding and CSS without forking core<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">When to consider alternatives<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You need a fully managed SaaS (Auth0, Okta, Azure AD B2C)<\/li>\n\n\n\n<li>Strict enterprise compliance + support SLAs without self-hosting<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\"  id=\"_ytid_94915\"  width=\"760\" height=\"427\"  data-origwidth=\"760\" data-origheight=\"427\" src=\"https:\/\/www.youtube.com\/embed\/fvxQ8bW0vO8?enablejsapi=1&#038;autoplay=0&#038;cc_load_policy=0&#038;cc_lang_pref=&#038;iv_load_policy=1&#038;loop=0&#038;rel=1&#038;fs=1&#038;playsinline=0&#038;autohide=2&#038;theme=dark&#038;color=red&#038;controls=1&#038;disablekb=0&#038;\" class=\"__youtube_prefs__  epyt-is-override  no-lazyload\" title=\"YouTube player\"  allow=\"fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen data-no-lazy=\"1\" data-skipgform_ajax_framebjll=\"\"><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Keycloak: Identity &amp; SSO Tool (IAM in one box) What it is Keycloak is an open-source Identity and Access Management (IAM) platform that provides Single Sign-On (SSO), user federation, identity&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-51455","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=51455"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51455\/revisions"}],"predecessor-version":[{"id":51456,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51455\/revisions\/51456"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=51455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=51455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=51455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}