Skip to Content

Device Authorization Flow

Le Device Authorization Grant (RFC 8628) permet aux utilisateurs de se connecter sur des appareils avec des capacités navigateur limitées ou absentes. Au lieu de saisir les identifiants directement sur l’appareil, l’utilisateur voit un code court et une URL. Il visite l’URL depuis un téléphone ou un ordinateur portable, saisit le code et approuve la demande. Pendant ce temps, l’appareil interroge l’endpoint token jusqu’à ce que l’utilisateur complète l’autorisation.

Cas d’usage courants :

  • Apps pour smart TV affichant un code à approuver avec le téléphone
  • Outils CLI qui ouvrent un navigateur pour l’authentification de l’utilisateur
  • Appareils IoT sans clavier ni écran affichant un code sur la sortie série
  • Terminaux kiosque et TPE

Comment ça Fonctionne

Le device flow est un protocole à deux canaux. L’appareil communique avec l’endpoint token, tandis que l’utilisateur interagit avec Auris via un navigateur sur un appareil séparé :

  1. L’appareil envoie une requête à /api/oauth/device/code avec son client_id et les scopes demandés
  2. Auris retourne un device_code (opaque, long), un user_code (court, lisible par l’utilisateur, 8 caractères), une verification_uri et un interval de polling
  3. L’appareil affiche le user_code et la verification_uri à l’utilisateur
  4. L’utilisateur visite l’URL de vérification dans un navigateur, saisit le code et s’authentifie avec Auris
  5. Pendant ce temps, l’appareil interroge POST /api/auth/token avec grant_type=urn:ietf:params:oauth:grant-type:device_code à l’intervalle spécifié
  6. Une fois que l’utilisateur approuve, le prochain poll retourne un access token et un refresh token
  7. Si l’utilisateur refuse ou le code expire, le poll retourne une erreur

Configuration dans la Console

Active le Device Flow

Dans la Console Auris, va dans Applications et sélectionne l’application qui utilisera le device flow. Dans l’onglet Paramètres, active Activer le Device Flow.

Configure les Paramètres

Définis la durée du device code et l’intervalle de polling :

ParamètreDéfautNotes
Durée du Code600 secondes (10 minutes)Temps maximum que l’utilisateur a pour saisir le code et approuver
Intervalle de Polling5 secondesIntervalle minimum entre les requêtes de polling du token depuis l’appareil
Longueur du Code Utilisateur8 caractèresAlphanumérique, majuscule, facile à lire et taper

Implémentation

// Étape 1 : Demande un device code const deviceAuth = await fetch('https://auth.votredomaine.com/api/oauth/device/code', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ client_id: 'votre-client-id-appareil', scope: 'openid profile email', }), }).then(r => r.json()) // Étape 2 : Affiche à l'utilisateur console.log(`Va sur : ${deviceAuth.verification_uri}`) console.log(`Saisis le code : ${deviceAuth.user_code}`) // Étape 3 : Interroge pour le token async function pollForToken(deviceAuth) { const interval = deviceAuth.interval * 1000 const expiresAt = Date.now() + deviceAuth.expires_in * 1000 while (Date.now() < expiresAt) { await new Promise(resolve => setTimeout(resolve, interval)) const response = await fetch('https://auth.votredomaine.com/api/auth/token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ grant_type: 'urn:ietf:params:oauth:grant-type:device_code', device_code: deviceAuth.device_code, client_id: 'votre-client-id-appareil', }), }) const data = await response.json() if (data.access_token) { return data // Succès ! } else if (data.error === 'authorization_pending') { continue // L'utilisateur n'a pas encore approuvé } else if (data.error === 'slow_down') { await new Promise(resolve => setTimeout(resolve, 5000)) // Ralentis } else { throw new Error(data.error) // access_denied, expired_token, etc. } } throw new Error('Code expiré') } const tokens = await pollForToken(deviceAuth) console.log('Authentifié :', tokens.access_token)

Guides Associés