Ir al contenido

Autenticación

La API usa Amazon Cognito como proveedor de identidad. El API Gateway valida el JWT con un Cognito authorizer antes de invocar la Lambda: si el token falta, es inválido o expiró, la respuesta es un 401 que ni siquiera llega al código de la aplicación.

  1. RegistroPOST /register crea el usuario en Cognito y su perfil en DynamoDB.
  2. LoginPOST /login con email y password devuelve los tokens:
{
"message": "Login successful",
"tokens": {
"idToken": "eyJraWQi...",
"accessToken": "eyJraWQi...",
"refreshToken": "eyJjdHki...",
"expiresIn": 3600
},
"user": { "id": "uuid", "email": "usuario@ejemplo.com" }
}
  1. Cada request autenticado manda el token en el header Authorization:
Authorization: Bearer <idToken>
  1. Expiración — los tokens duran expiresIn segundos (3600 por defecto). Con token expirado la API responde 401 con {"error": "Token Expired", ...}; el cliente debe renovar sesión (re-login o refresh token).
Endpoint Por qué
GET /ping Health check
POST /register Aún no existe el usuario
POST /login Es el que emite el token
POST /billing/webhook Lo llama Stripe; se valida con la firma Stripe-Signature, no con JWT

Todo lo demás requiere Authorization: Bearer <token>.

Las lambdas obtienen el usuario del contexto que inyecta el authorizer — el sub del JWT es el userId:

user_id = event['requestContext']['authorizer']['claims']['sub']

Nunca se confía en un userId mandado por el cliente para identificar al llamador.

Existe un segundo user pool de Cognito exclusivo para conductores, con su propio authorizer (lade-{env}-api-cognito-drivers-authorizer). Los endpoints de la app de conductores validan contra ese pool — un token del pool principal no funciona ahí, y viceversa.

Pasar el authorizer solo prueba quién eres. Cada Lambda valida después qué puedes hacer según tu membresía y rol en el equipo (OWNER, ADMIN, USER) — ver Multi-tenancy. Si no eres miembro del equipo del recurso: 403.