Go + Keycloak
Aprende a proteger aplicaciones Go con Keycloak construyendo, lección a lección, una tienda con login, una API protegida con JWT, un servicio interno y una herramienta de administración. Después la conectas a directorios corporativos, la reorganizas para probarla, le añades un segundo factor y la despliegas como en producción.
Para quién es
- Sabes Go básico: módulos,
net/http, structs,encoding/json, manejo de errores. - No hace falta saber nada de Keycloak, OAuth2 ni OpenID Connect: se explican desde cero.
De qué trata el curso
El problema: cada aplicación con su propio login
Casi toda aplicación necesita saber quién la usa y qué puede hacer cada persona. La forma ingenua es que cada una lo resuelva por su cuenta: su tabla de usuarios, sus contraseñas (bien guardadas, con hash), su pantalla de login, su «olvidé mi contraseña», su bloqueo tras varios intentos fallidos… Y luego llegan las peticiones de verdad: un segundo factor para los administradores, que los empleados entren con su cuenta de la empresa, que quien inicia sesión en una aplicación no tenga que volver a hacerlo en la siguiente, que al dar de baja a alguien pierda el acceso a todo a la vez.
Hacer todo eso bien es mucho trabajo, es fácil equivocarse y es exactamente igual en todas las aplicaciones. Por eso existe un tipo de programa dedicado solo a ello: el servidor de identidad.
Keycloak: el que decide quién es quién
Keycloak es un servidor de identidad de código abierto. Se instala una vez y todas tus aplicaciones lo usan: él muestra la pantalla de login, guarda las contraseñas, pide el segundo factor, gestiona usuarios, grupos y roles, y se conecta a lo que ya tenga la empresa (Active Directory, Microsoft Entra ID, Google…). Cuando alguien demuestra quién es, Keycloak le entrega un token: un documento firmado digitalmente que dice quién es, qué roles tiene y hasta cuándo vale.
Una forma sencilla de imaginarlo es un hotel. Keycloak es la recepción: comprueba tu identidad una vez y te da una tarjeta. Tus aplicaciones son las puertas: no te vuelven a pedir el pasaporte, solo leen la tarjeta y comprueban tres cosas: que es auténtica (la firma), que no ha caducado y que es para esa puerta. Si pierdes el derecho a entrar, recepción deja de renovarte la tarjeta.
Para que recepción y puertas se entiendan, Keycloak usa dos estándares abiertos: OAuth 2.0 (cómo se piden y se usan los tokens) y OpenID Connect (cómo se identifica a la persona). Al ser estándares, lo que aprendas aquí te sirve también con otros proveedores, como Entra ID, Auth0 u Okta.
Go: las puertas
Tus programas en Go no gestionan contraseñas ni usuarios: hablan con Keycloak y confían en sus tokens. El trabajo se reparte así:
| Se encarga Keycloak | Se encarga tu código Go |
|---|---|
| Mostrar el login, comprobar contraseñas y segundo factor | Mandar al usuario a ese login y recibir el resultado de forma segura (una web) |
| Emitir y firmar tokens, y publicar las claves para verificarlos | Validar el token en cada petición, sin preguntar a Keycloak cada vez (una API) |
| Usuarios, grupos, roles; conectar con el directorio de la empresa | Decidir qué puede hacer cada uno según esos roles: las reglas de tu negocio |
| Sesiones, inicio de sesión único y cierre de sesión | Pedir tokens propios para hablar con otros servicios, con o sin usuario |
| Su propia configuración (clients, roles, proveedores…) | Automatizar esa configuración desde Go, en lugar de hacerla a mano en la consola |
Go encaja muy bien en este papel. La biblioteca estándar (net/http) basta para escribir webs y APIs; dos librerías pequeñas y muy usadas, go-oidc y golang.org/x/oauth2, resuelven el protocolo; y validar un token es una operación local y rápida, así que tu API no depende de Keycloak en cada petición. El resultado son programas sencillos de leer y de desplegar.
Cómo lo vas a aprender
No es un catálogo de opciones de Keycloak, sino un proyecto que crece: una pequeña tienda online escrita en Go. Empiezas con lo mínimo (un Keycloak en Docker y un programa que lo consulta) y en cada lección añades una pieza real: el login de la web, una API protegida, un servicio interno que factura, una herramienta de administración, los usuarios del Active Directory de una empresa, un segundo factor para lo delicado… hasta desplegarla con HTTPS como en producción.
Todo lo que ves está probado: el código compila, los comandos se han ejecutado y las salidas son reales. Cuando algo no funcionaba como esperábamos, la lección lo cuenta, porque esas trampas son justo las que te encontrarás en un proyecto de verdad. Al terminar sabrás tanto el cómo como el por qué de cada pieza.
Lo que no es: un curso de Go desde cero (se asume lo básico) ni de administración avanzada de Keycloak (clústeres, temas visuales, ajuste fino del servidor). Es lo que necesita quien programa en Go para integrar Keycloak bien.
Qué vas a construir
Una pequeña tienda online formada por varios programas Go que confían en Keycloak para saber quién es cada usuario o servicio y qué puede hacer:
| Componente | Qué hace | Qué aprendes |
|---|---|---|
tienda-web | Catálogo público y página «Mis pedidos» con login. | Authorization Code + PKCE, ID token, sesión, refresh, logout. |
api-pedidos | API REST de pedidos. | Validar JWT con JWKS, aud, roles y scopes. |
facturacion | Servicio interno que consulta pedidos para facturar. | Client Credentials y Token Exchange. |
admin-tool | CLI que da de alta clientes y configura el realm. | Admin REST API con gocloak. |
Mapa del curso
Preparar tu equipo
Windows (con o sin WSL), macOS o Linux.
01 · FundamentosOAuth2 y OIDC desde cero
Roles, flujos, tokens, claims y PKCE.
02 · FundamentosKeycloak en Docker
Realm, clients, roles, usuarios; exportar e importar.
03 · Login webLogin con PKCE
tienda-web: go-oidc, x/oauth2 y sesiones.
04 · Login webSesión, refresh y logout
Renovar tokens, logout SSO y back-channel.
05 · APIMiddleware JWT
api-pedidos: JWKS, audiencia y flujo de dispositivo.
06 · APIRoles y scopes
Autorización por ruta, 401 frente a 403.
07 · ServiciosClient Credentials
facturacion: un servicio sin usuario.
08 · ServiciosToken Exchange
Actuar en nombre del usuario (RFC 8693).
09 · Admingocloak
Usuarios, roles, grupos y sesiones desde Go.
10 · AdminAutomatizar el realm
Aprovisionar servicios: plan, aplicar, desviaciones.
11 · DirectorioActive Directory
Usuarios y grupos de AD en Keycloak, con un AD de prueba.
12 · IdentidadCuenta de la empresa
Identity brokering con un «Entra ID» de prueba.
13 · ArquitecturaArquitectura hexagonal
Keycloak como adaptador; el dominio, sin tokens.
14 · ArquitecturaTests en Go
Del dominio a un Keycloak real con testcontainers.
15 · SeguridadSegundo factor (step-up)
Código TOTP solo para lo delicado; RFC 9470.
16 · ProducciónKeycloak en producción
Imagen optimizada, TLS con Caddy y Go por HTTPS.
Anexo Azitadel/oidc
El mismo login con otra librería, comparado.
Cómo usar el curso
El código vive junto a este sitio, en la carpeta tienda/. Es un único proyecto que crece: cada lección indica en qué carpeta pasos/paso-NN está su estado final, que es una copia completa y compilable, con su propio infra/ (Keycloak y el realm de ese paso).
Desde la lección 5, cada paso trae un realm distinto. Para pasar de uno a otro: docker compose down -v en el infra/ del paso anterior y docker compose up -d en el del nuevo. El -v borra la base de datos para que el realm se importe de nuevo.
course/
├─ site/ ← este sitio (ábrelo con doble clic en index.html)
└─ tienda/
└─ pasos/
├─ paso-02/ ← Keycloak + realm + primer programa Go
│ ├─ go.mod
│ ├─ cmd/discover/
│ └─ infra/ ← docker-compose.yml y realm/tienda-realm.json
├─ paso-03/ ← tienda-web: login con PKCE
├─ paso-04/ ← tienda-web: refresh y logout
├─ paso-05/ ← api-pedidos: middleware JWT
├─ paso-06/ ← roles y scopes
├─ paso-07/ ← facturacion: Client Credentials
├─ paso-08/ ← Token Exchange
├─ paso-09/ ← CLI de administración (gocloak)
├─ paso-10/ ← aprovisionador del realm
├─ paso-11/ ← usuarios de Active Directory (AD de prueba incluido)
├─ paso-12/ ← entrar con la cuenta de la empresa (brokering)
├─ paso-13/ ← api-pedidos en arquitectura hexagonal
├─ paso-14/ ← tests (y uno con Keycloak real)
├─ paso-15/ ← segundo factor para gestionar (step-up)
├─ paso-16/ ← lo mismo, más infra/produccion (TLS, imagen optimizada)
└─ anexo-a/ ← el login con zitadel/oidc (módulo aparte)
Para leer con más espacio, oculta el índice con el botón ☰ de la barra superior o con la tecla [; el curso recuerda tu elección.
| Herramienta | Para qué |
|---|---|
| En este capítulo (recuadro al inicio de cada lección) | Qué componente trabajas, en qué carpeta, qué archivos cambian, qué tener en marcha y cómo comprobarlo. |
| Ver todos los cambios del paso | Una página por lección con cada archivo nuevo, modificado o eliminado respecto al paso anterior, en verde y rojo. |
go -C tools/comprobar run . -paso N | Comprueba que tu Keycloak (y con -servicios, tus programas) están como los deja la lección N. Desde la lección 2. |
| ▶ Paso a paso (bajo algunos diagramas) | Reproduce el diagrama flecha a flecha, con pausa y paso anterior/siguiente: los flujos de las lecciones 1, 8, 12 y 15. |
| ⚡ Ruta rápida (barra superior) | Oculta las secciones marcadas como adicional: lo imprescindible primero, el resto cuando quieras. |
| Buscar (índice lateral, o tecla /) | Busca en todas las lecciones y salta a la sección. |
| Imprimir (Ctrl+P) | Sin menús, con todas las soluciones y secciones desplegadas: sirve para guardar el curso en PDF. |
Cada lección sigue la misma estructura:
- En este capítulo y objetivos: qué vas a tocar y qué sabrás al terminar.
- Teoría justa con un diagrama del flujo.
- Práctica paso a paso, con el código completo.
- Ejercicios con la solución desplegable (intenta resolverlos antes de abrirla).
- Errores comunes: el mensaje que verás, por qué ocurre y cómo arreglarlo.
Requisitos
| Herramienta | Versión | Notas |
|---|---|---|
| Go | 1.26 o superior | Lo exigen las versiones actuales de go-oidc y x/oauth2. Usamos además los patrones de ruta de http.ServeMux, crypto/rand.Text y http.CrossOriginProtection. |
| Docker | Docker Desktop, OrbStack o Docker Engine, con Compose v2 | Instrucciones para cada sistema en Preparar tu equipo. |
| Navegador | Cualquiera moderno | Útil abrir una ventana privada para probar con distintos usuarios. |
| curl | — | Para inspeccionar endpoints a mano. |
El curso funciona en los tres. Los comandos de las lecciones usan sintaxis de bash (macOS, Linux, WSL, Git Bash). Si usas PowerShell, o quieres saber qué cambia en tu sistema, lee primero Preparar tu equipo.
Convenciones del curso
Puertos
| Puerto | Servicio |
|---|---|
8080 | Keycloak: consola de administración y endpoints OIDC |
9000 | Keycloak: puerto de gestión (/health/ready) |
3000 | tienda-web |
8081 | api-pedidos |
8082 | facturacion |
Usuarios de prueba
| Usuario | Contraseña | Realm | Roles |
|---|---|---|---|
admin | admin | master | Administrador de Keycloak (consola) |
ana | ana123 | tienda | cliente |
carlos | carlos123 | tienda | cliente, admin |
Contraseñas, secretos de clients y el modo start-dev son deliberadamente simples para aprender. En producción: HTTPS, start con --hostname, secretos fuera del código y contraseñas reales.