Skip to Content

Hosted Login (Universal Login)

Le Problème : Où Doit Vivre le Formulaire de Login ?

Toute application qui authentifie des utilisateurs doit décider où vit le formulaire de login. Il y a trois approches fondamentales et le choix a de profondes implications de sécurité.

Login Intégré (l’approche risquée)

L’application rend son propre formulaire de login et collecte les credentials directement. Le problème : le code JavaScript de ton application peut lire le formulaire de login, intercepter les touches pressées et accéder aux credentials.

Login Hébergé (l’approche sécurisée)

Les credentials sont saisies sur une origine différente — celle contrôlée par l’identity provider. Le JavaScript de ton application ne peut pas lire les champs du formulaire, intercepter les touches pressées ou accéder aux credentials de quelque manière que ce soit. La politique same-origin du browser applique cette frontière automatiquement.

RisqueLogin IntégréLogin Hébergé
XSS vole les credentialsOui — ton JS peut lire le champ mot de passeNon — origine différente, ton JS ne peut pas y accéder
Script tiers lit les credentialsOuiNon — les scripts tiers sur ton origine ne peuvent pas atteindre la page auth
Phishing des credentials via manipulation DOMOuiNon — la page de login est sur le domaine de l’IdP
Enforcement MFATu dois l’implémenterL’IdP le gère de manière transparente
Périmètre d’audit de conformitéToute ton applicationSeulement les pages de login de l’IdP

Le Hosted Login est l’approche recommandée par l’OAuth 2.0 Security Best Current Practice (RFC 6819). Auth0 l’appelle “Universal Login,” Okta l’appelle “Okta-hosted Sign-In,” et Auris l’appelle “Hosted Login.” Le principe de sécurité est le même : ne laisse jamais ton application toucher les credentials brutes.

Comment ça Fonctionne : Le Flux Complet

Auris Hosted Login implémente le flux OAuth2 Authorization Code avec PKCE (RFC 7636). Le flux :

  1. Ton app génère un code verifier et un code challenge PKCE
  2. Le browser est redirigé vers l’endpoint /api/oauth/authorize d’Auris avec le code challenge
  3. Auris crée une OAuthSession pour tracker la progression
  4. L’utilisateur est redirigé vers la page de login hébergée d’Auris
  5. L’utilisateur saisit ses credentials (email/mot de passe, magic link, social, etc.)
  6. Si requis, l’écran MFA est présenté
  7. Auris émet un authorization code à usage unique (5 minutes)
  8. Le browser est redirigé vers le redirect_uri de ton app avec le code
  9. Ton app valide le state (protection CSRF) et échange le code contre des tokens
  10. Auris vérifie le code challenge PKCE et émet les tokens

PKCE S256 : Pourquoi C’est Important

PKCE (Proof Key for Code Exchange) prévient les attaques d’interception de l’authorization code.

Si un attaquant intercepte l’authorization code dans l’URL de redirection, il ne peut pas l’échanger. Pour échanger le code, il a besoin du code_verifier — qui n’a jamais été transmis par la barre URL du browser. Il était stocké dans la mémoire du client et envoyé directement à l’endpoint token via HTTPS.

Auris applique PKCE S256 à tous les flux authorization code. La méthode de challenge plain est rejetée. Il n’existe pas de configuration pour désactiver PKCE — il est toujours requis.

Gestion des Sessions

Auris utilise deux modèles côté serveur pour gérer le flux hosted login :

OAuthSession

Créée quand l’utilisateur arrive à l’endpoint authorize. Stockée dans la base de données et identifiée par un cookie httpOnly.

ChampDescription
sessionTokenIdentifiant unique (défini comme cookie httpOnly, Secure, SameSite=Lax)
clientIdL’application qui demande l’authentification
redirectUriOù rediriger après l’authentification
codeChallengeCode challenge PKCE (S256)
stateValeur state CSRF du client
scopeScopes OAuth demandés
TTL30 minutes (la session expire si l’utilisateur ne complète pas le login)

AuthorizationCode

Créé après une authentification réussie.

ChampDescription
codeAuthorization code unique
clientIdDoit correspondre au client_id de la requête token
redirectUriDoit correspondre exactement au redirect_uri de la requête token
codeChallengeStocké pour la vérification PKCE lors de l’échange token
TTL5 minutes
usedAtDéfini atomiquement à la première utilisation (enforcement à usage unique)

Pipeline de Sécurité au Login

Chaque tentative de login passe par un pipeline de vérifications de sécurité dans cette séquence :

  1. Rate limiting : Limite de 10 tentatives par IP toutes les 15 minutes
  2. Compte bloqué : Si le compte est bloqué, refus immédiat
  3. Vérification des credentials : Email + mot de passe vérifié dans Keycloak
  4. Détection des accès suspects : IP/pays inconnu, nouvel appareil, heure inhabituelle
  5. Risk scoring adaptatif : Score de 0 à 100 basé sur des signaux comportementaux
  6. Évaluation de la policy MFA : Déclenchement MFA si requis par la policy ou le score de risque
  7. Actions Engine : Hooks personnalisés pre_login et post_login
  8. Émission des tokens : Génération de l’access token, refresh token et ID token

Protection Brute Force

MétriqueSeuilAction
Tentatives de login10 en 15 min (par IP)Blocage temporaire 15 min
Tentatives échouées5 consécutives (par utilisateur)Blocage du compte, email de notification
Trafic anormalDétecté par analyse IPRate limiting adaptatif

Domaines Personnalisés

Quand un domaine personnalisé est configuré, la page de login hébergée est servie depuis ce domaine. Le pipeline de sécurité est identique. Les certificats SSL sont gérés automatiquement via Let’s Encrypt.

Pages de Login Branded

La page de login hébergée reflète automatiquement :

  • Le logo téléchargé dans les paramètres de branding
  • La couleur primaire de la marque
  • Le nom de l’organisation
  • Les fournisseurs de login social configurés

Implémentation avec le SDK

import { AurisClient } from '@auris/js' const auris = new AurisClient({ domain: 'api.altovar.net', clientId: 'votre-client-id', redirectUri: 'https://app.votredomaine.com/callback', }) // Démarre le login await auris.loginWithRedirect() // Gère le callback const { user } = await auris.handleRedirectCallback()

Le SDK gère automatiquement la génération PKCE, le stockage, la validation du state et l’échange du code.

Concepts Associés

  • OAuth 2.0 & OIDC — Les protocoles sous-jacents
  • Flux PKCE — Guide technique détaillé du flux PKCE
  • Sessions — Comment les sessions sont créées et gérées après le login
  • Guide Hosted Login — Intègre le login hébergé dans ton application
  • Branding — Personnalise l’apparence de la page de login