API de autenticación y sesión
El inicio de sesión utiliza un desafío de corta duración, confirmación por Telegram y prueba de control del navegador original. Un ID de Telegram proporcionado por el cliente no es prueba de identidad.
En esta página
Inicio de sesión#
POST /api/auth/telegram/start acepta un objeto JSON vacío {}. Requiere el Origin exacto de la aplicación y un bot disponible. El servidor crea un desafío que dura 300 segundos y una cookie protegida de prueba del navegador.
La respuesta 201 contiene challengeId, code, expiresAt y telegramUrl. La cookie de prueba se excluye del enlace profundo y es inaccesible para JavaScript. El límite es de seis inicios por minuto por dirección con hash.
const response = await fetch('/api/auth/telegram/start', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: '{}'
});
const challenge = await response.json();
// Show code and telegramUrl to the user.Esperando confirmación#
POST /api/auth/telegram/complete acepta {challengeId}. Requiere Origin y la cookie original de prueba del navegador. Hasta la confirmación, la respuesta es 202 {status: "pending"}.
Después de la confirmación, 200 devuelve status=authenticated, user, csrfToken y expiresAt. Se emite una sesión una sola vez. Los desafíos caducados devuelven 410; los desafíos usados o cancelados devuelven 409.
const response = await fetch('/api/auth/telegram/complete', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ challengeId: challenge.challengeId })
});
if (response.status === 202) {
// Poll again after a delay; do not create a new challenge.
}Lectura de la sesión#
GET /api/auth/me devuelve 200 {authenticated:false} cuando no existe una sesión válida. Una respuesta con sesión iniciada incluye el usuario, el token CSRF y la caducidad.
La cookie __Host-kevmi-session dura hasta 24 horas con Secure, HttpOnly, SameSite=Lax y Path=/. La base de datos almacena un hash SHA-256 de su token. Un formulario de perfil no puede leer ni reemplazar la cookie.
Cambios en la cuenta#
Las mutaciones requieren la sesión, el Origin exacto y el X-CSRF-Token actual. Se rechaza Sec-Fetch-Site: cross-site. El servidor no ofrece acceso CORS arbitrario.
El ID de la cuenta proviene de la sesión, no de la entrada de la solicitud. Los registros faltantes o de otro usuario no revelan detalles de propiedad distinguibles.
Cierre de sesión#
POST /api/auth/logout finaliza la sesión actual y borra la cookie. Se requieren Origin y CSRF; el cuerpo no se lee. Telegram /logout también finaliza todas las sesiones de la cuenta.
Las cookies no se mueven automáticamente a otro dominio. Al cambiar el dominio del servicio, actualice APP_ORIGIN y el webhook del bot, y luego inicie sesión nuevamente.