# Flujo de autenticación JWT — API CartecWeb

Guía paso a paso para obtener un token y usarlo en los endpoints que lo requieren.

---

## 1. Base URL

Todas las llamadas usan esta base (reemplaza la IP si te dan otra):

```
http://34.41.180.210:3000
```

---

## 2. Obtener el token

**Paso 1.** Hacer un `POST` al endpoint `/api/auth/token` con la clave de API en el body.

**Un solo comando (copiar y pegar):**

```bash
curl -s -X POST "http://34.41.180.210:3000/api/auth/token" -H "Content-Type: application/json" -d '{"apiKey":"cartecst"}'
```

**Respuesta esperada (ejemplo):**

```json
{"success":true,"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","expiresIn":"1h"}
```

**Paso 2.** Copiar solo el valor de `token` (la cadena larga que empieza con `eyJ...`). Ese es tu JWT.  
El token caduca en 1 hora; después hay que pedir uno nuevo.

---

## 3. Usar el token en las peticiones

Los endpoints que piden autenticación (por ejemplo **crear OT**) exigen el token en el header:

```
Authorization: Bearer TU_TOKEN_AQUI
```

Sustituye `TU_TOKEN_AQUI` por el token que copiaste en el paso 2.

---

## 4. Ejemplo: crear una OT (con token)

**Paso 1.** Obtener token y guardarlo en una variable (Linux/Mac):

```bash
TOKEN=$(curl -s -X POST "http://34.41.180.210:3000/api/auth/token" -H "Content-Type: application/json" -d '{"apiKey":"cartecst"}' | grep -o '"token":"[^"]*"' | cut -d'"' -f4)
```

**Paso 2.** Crear la OT usando ese token:

```bash
curl -s -X POST "http://34.41.180.210:3000/api/ot/create" -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d '{"cliente":{"rut":"12345678-5","nombre":"Cliente Prueba","direccion":"Av. Principal 123","comuna":"Santiago"},"tecnico":{"rut":"11111111-1"},"servicio":{"presGPS":"gpsimple","tiposerv":"instalacion_gps","taller_install":"domicilio"},"vehiculos":[{"patente":"ABC123"}]}'
```

Si todo va bien, la respuesta será algo como:

```json
{"success":true,"message":"Orden de trabajo creada exitosamente","id_ot":123}
```

---

## 5. Resumen del flujo

| Paso | Qué haces | Endpoint | ¿Lleva token? |
|------|-----------|-----------|----------------|
| 1 | Pedir token | `POST /api/auth/token` con `{"apiKey":"cartecst"}` | No |
| 2 | Crear OT | `POST /api/ot/create` con body de cliente/tecnico/servicio/vehiculos | **Sí** (`Authorization: Bearer <token>`) |
| 3 | Otros (health, listar OT, etc.) | Ver ENDPOINTS.md | Solo `/api/ot/create` requiere token por ahora |

---

## 6. Errores frecuentes

- **401 "Falta token"** → No enviaste el header `Authorization: Bearer <token>` en `/api/ot/create`.
- **401 "Token inválido o expirado"** → El token caducó (1 h) o está mal copiado. Vuelve al paso 2 y pide uno nuevo.
- **401 "apiKey inválido"** → En el body de `/api/auth/token` el valor de `apiKey` no es el correcto (por defecto `cartecst`).

---

## 7. Probar que el token funciona (endpoint de prueba)

Después de obtener el token:

```bash
curl -s "http://34.41.180.210:3000/api/test/protected" -H "Authorization: Bearer TU_TOKEN_AQUI"
```

Respuesta esperada:

```json
{"success":true,"message":"JWT válido","user":{"sub":"test","iat":...,"exp":...}}
```

Si ves eso, el token es válido y puedes usarlo en `/api/ot/create`.

---

---

# Pruebas en Postman

Mismo flujo (obtener token → usarlo) pero desde Postman.

**Base URL:** `http://34.41.180.210:3000`

---

## Request 1 — Obtener token

| Campo | Valor |
|-------|--------|
| Método | **POST** |
| URL | `http://34.41.180.210:3000/api/auth/token` |
| Headers | `Content-Type` = `application/json` |
| Body | **raw** → **JSON** |

**Body (copiar tal cual):**

```json
{
  "apiKey": "cartecst"
}
```

**Enviar.** En la respuesta, copiar el valor de `token` (todo el string que empieza con `eyJ...`).

---

## Request 2 — Probar que el token sirve (opcional)

| Campo | Valor |
|-------|--------|
| Método | **GET** |
| URL | `http://34.41.180.210:3000/api/test/protected` |
| Headers | `Authorization` = `Bearer <pegar aquí el token>` |

Sustituir `<pegar aquí el token>` por el token copiado en el Request 1. Enviar. Debe devolver `"message": "JWT válido"`.

---

## Request 3 — Crear OT (con token)

| Campo | Valor |
|-------|--------|
| Método | **POST** |
| URL | `http://34.41.180.210:3000/api/ot/create` |
| Headers | `Content-Type` = `application/json` |
| Headers | `Authorization` = `Bearer <pegar aquí el token>` |
| Body | **raw** → **JSON** |

**Body de ejemplo:**

```json
{
  "cliente": {
    "rut": "12345678-5",
    "nombre": "Cliente Postman",
    "direccion": "Av. Test 123",
    "comuna": "Santiago"
  },
  "tecnico": {
    "rut": "11111111-1"
  },
  "servicio": {
    "presGPS": "gpsimple",
    "tiposerv": "instalacion_gps",
    "taller_install": "domicilio"
  },
  "vehiculos": [
    { "patente": "ABC123" }
  ]
}
```

Enviar. Respuesta correcta: `"success": true` y `"id_ot": <número>`.

---

## Orden en Postman

1. Ejecutar **Request 1** → copiar el `token`.
2. (Opcional) **Request 2** con ese token para verificar.
3. **Request 3**: en el header `Authorization` poner `Bearer ` + el token (sin espacios de más), y enviar.
