# Guía de Configuración de Keycloak para Anexo76

Esta guía te ayudará a configurar Keycloak para usar con Anexo76.

# Script auto initialize

Te genera toda la configruracion inicial de keycloack que se ve en este documento,
aparte de esto te genera un primer usuario configurado con su tenant y una company 

```
scripts/init_first_time.sh
```

## 1. Acceder a Keycloak Admin Console

1. Abrir http://localhost:8080
2. Hacer clic en "Administration Console"
3. Login con: `admin` / `admin`

## 2. Configurar Cliente Backend

### Crear Cliente Backend

1. En el menú izquierdo, ir a **Clients**
2. Clic en **Create client**
3. Configurar:
   - **Client ID**: `anexo76-backend`
   - **Client Protocol**: `openid-connect`
   - Clic en **Next**
4. En la siguiente pantalla:
   - **Client authentication**: ON (Confidential)
   - **Authorization**: OFF
   - **Authentication flow**: Marcar solo "Standard flow" y "Direct access grants"
   - Clic en **Next**
5. En "Login settings":
   - **Root URL**: `http://localhost:8000`
   - **Valid redirect URIs**: `http://localhost:8000/*`
   - **Web origins**: `http://localhost:8000`
   - Clic en **Save**

### Obtener Client Secret

1. Ir a la pestaña **Credentials**
2. Copiar el **Client secret**
3. Agregar al archivo `backend/.env`:
   ```
   KEYCLOAK_CLIENT_SECRET=tu-client-secret-aqui
   ```

## 3. Configurar Cliente Frontend

### Crear Cliente Frontend

1. En **Clients**, clic en **Create client**
2. Configurar:
   - **Client ID**: `anexo76-frontend`
   - **Client Protocol**: `openid-connect`
   - Clic en **Next**
3. En la siguiente pantalla:
   - **Client authentication**: OFF (Public)
   - **Authorization**: OFF
   - **Authentication flow**: Marcar "Standard flow"
   - Clic en **Next**
4. En "Login settings":
   - **Root URL**: `http://localhost:5173`
   - **Valid redirect URIs**:
     - `http://localhost:5173/*`
     - `http://localhost:3000/*`
   - **Valid post logout redirect URIs**:
     - `http://localhost:5173/*`
     - `http://localhost:3000/*`
   - **Web origins**:
     - `http://localhost:5173`
     - `http://localhost:3000`
   - Clic en **Save**

## 4. Crear Usuario de Prueba

### Crear Usuario

1. En el menú izquierdo, ir a **Users**
2. Clic en **Add user**
3. Configurar:
   - **Username**: `demo`
   - **Email**: `demo@empresa-demo.com`
   - **First name**: `Usuario`
   - **Last name**: `Demo`
   - **Email verified**: ON
   - Clic en **Create**

### Establecer Contraseña

1. Ir a la pestaña **Credentials**
2. Clic en **Set password**
3. Configurar:
   - **Password**: `demo123`
   - **Password confirmation**: `demo123`
   - **Temporary**: OFF (para no tener que cambiar la contraseña)
4. Clic en **Save**

### Agregar Atributo tenant_id

1. En el mismo usuario, ir a la pestaña **Attributes**
2. Clic en **Add an attribute**
3. Configurar:
   - **Key**: `tenant_id`
   - **Value**: `1`
4. Clic en **Save**

### Asignar Roles

1. Ir a la pestaña **Role mappings**
2. En "Available roles", buscar y asignar:
   - `admin` (si existe)
   - `user` (si existe)
3. Si no existen estos roles, crearlos primero:
   - Ir a **Realm roles** en el menú izquierdo
   - Crear roles: `admin`, `user`, `auditor`, `system`
   - Regresar al usuario y asignar roles

## 5. Configurar Mapper para tenant_id (Opcional pero recomendado)

Para que el `tenant_id` se incluya automáticamente en el token:

1. Ir a **Clients** → `anexo76-backend`
2. Ir a la pestaña **Client scopes**
3. Clic en `anexo76-backend-dedicated`
4. Ir a la pestaña **Mappers**
5. Clic en **Add mapper** → **By configuration** → **User Attribute**
6. Configurar:
   - **Name**: `tenant-id-mapper`
   - **User Attribute**: `tenant_id`
   - **Token Claim Name**: `tenant_id`
   - **Claim JSON Type**: `String`
   - **Add to ID token**: ON
   - **Add to access token**: ON
   - **Add to userinfo**: ON
7. Clic en **Save**

Repetir para el cliente `anexo76-frontend` si es necesario.

## 6. Verificar Configuración

### Probar desde el Frontend

1. Abrir http://localhost:5173
2. Hacer clic en "Iniciar Sesión"
3. Ingresar credenciales:
   - Usuario: `demo`
   - Contraseña: `demo123`
4. Deberías ver el dashboard con información del usuario y licencia

### Probar desde el API

```bash
# Obtener token
curl -X POST http://localhost:8080/realms/master/protocol/openid-connect/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=anexo76-backend" \
  -d "client_secret=TU_CLIENT_SECRET" \
  -d "username=demo" \
  -d "password=demo123" \
  -d "grant_type=password"

# Usar el token para llamar al API
curl -X GET http://localhost:8000/v1/auth/me \
  -H "Authorization: Bearer TU_ACCESS_TOKEN"
```

## 7. Configuración Adicional (Opcional)

### Personalizar Tema de Login

1. Ir a **Realm settings** → **Themes**
2. Seleccionar tema de login deseado
3. Guardar cambios

### Configurar Timeout de Sesión

1. Ir a **Realm settings** → **Sessions**
2. Ajustar:
   - **SSO Session Idle**: Tiempo de inactividad antes de expirar (ej: 30 minutos)
   - **SSO Session Max**: Tiempo máximo de sesión (ej: 10 horas)
3. Guardar cambios

### Habilitar Registro de Usuarios (Opcional)

1. Ir a **Realm settings** → **Login**
2. Activar **User registration**
3. Guardar cambios

## Troubleshooting

### Error: "Invalid redirect URI"

- Verificar que las URIs en el cliente coincidan exactamente
- Incluir el protocolo (http:// o https://)
- Incluir el puerto si es necesario

### Error: "Client not found"

- Verificar que el Client ID sea exacto
- Verificar que el realm sea correcto

### Token no incluye tenant_id

- Verificar que el usuario tenga el atributo configurado
- Verificar que el mapper esté configurado correctamente
- Probar obteniendo un nuevo token

### Usuario no puede hacer login

- Verificar que el usuario esté habilitado (User enabled: ON)
- Verificar que el email esté verificado (Email verified: ON)
- Verificar que la contraseña no sea temporal

## Próximos Pasos

1. Para producción, cambiar el realm de `master` a uno dedicado
2. Configurar HTTPS/TLS en Keycloak
3. Configurar backup de la base de datos de Keycloak
4. Implementar políticas de contraseña más estrictas
5. Configurar MFA (Multi-Factor Authentication)

---

**¡Listo!** Tu configuración de Keycloak está completa para desarrollo.
