API d'authentification et de session
La connexion utilise un défi de courte durée, une confirmation Telegram et une preuve de contrôle du navigateur d'origine. Un identifiant Telegram fourni par le client ne constitue pas une preuve d'identité.
Sur cette page
Démarrage de la connexion#
POST /api/auth/telegram/start accepte un objet JSON vide {}. Cela nécessite l'Origine exacte de l'application et un bot disponible. Le serveur crée un défi d'une durée de 300 secondes et un cookie protégé de preuve du navigateur.
La réponse 201 contient challengeId, code, expiresAt et telegramUrl. Le cookie de preuve est exclu du lien profond et est inaccessible à JavaScript. La limite est de six démarrages par minute par adresse hachée.
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.Attente de confirmation#
POST /api/auth/telegram/complete accepte {challengeId}. Cela nécessite l'Origine et le cookie original de preuve du navigateur. Jusqu'à confirmation, la réponse est 202 {status: "pending"}.
Après confirmation, 200 retourne status=authenticated, user, csrfToken et expiresAt. Une session est émise une seule fois. Les défis expirés retournent 410 ; les défis utilisés ou annulés retournent 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.
}Lecture de la session#
GET /api/auth/me retourne 200 {authenticated:false} lorsqu'aucune session valide n'existe. Une réponse connectée inclut l'utilisateur, le jeton CSRF et l'expiration.
Le cookie __Host-kevmi-session dure jusqu'à 24 heures avec Secure, HttpOnly, SameSite=Lax et Path=/. La base de données stocke un hachage SHA-256 de son jeton. Un formulaire de profil ne peut pas lire ni remplacer le cookie.
Modifications du compte#
Les mutations nécessitent la session, l'Origine exacte et le X-CSRF-Token actuel. Sec-Fetch-Site : cross-site est rejeté. Le serveur n'offre pas d'accès CORS arbitraire.
L'identifiant du compte provient de la session, pas des entrées de la requête. Les enregistrements manquants ou ceux d'un autre utilisateur ne divulguent pas de détails d'appartenance identifiables.
Déconnexion#
POST /api/auth/logout met fin à la session actuelle et efface le cookie. L'Origine et le CSRF sont requis ; le corps n'est pas lu. Telegram /logout met également fin à toutes les sessions du compte.
Les cookies ne migrent pas automatiquement vers un autre domaine. Lors du changement de domaine de service, mettez à jour APP_ORIGIN et le webhook du bot, puis reconnectez-vous.