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é :
- L’appareil envoie une requête à
/api/oauth/device/codeavec sonclient_idet les scopes demandés - Auris retourne un
device_code(opaque, long), unuser_code(court, lisible par l’utilisateur, 8 caractères), uneverification_uriet unintervalde polling - L’appareil affiche le
user_codeet laverification_urià l’utilisateur - L’utilisateur visite l’URL de vérification dans un navigateur, saisit le code et s’authentifie avec Auris
- Pendant ce temps, l’appareil interroge
POST /api/auth/tokenavecgrant_type=urn:ietf:params:oauth:grant-type:device_codeà l’intervalle spécifié - Une fois que l’utilisateur approuve, le prochain poll retourne un access token et un refresh token
- 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ètre | Défaut | Notes |
|---|---|---|
| Durée du Code | 600 secondes (10 minutes) | Temps maximum que l’utilisateur a pour saisir le code et approuver |
| Intervalle de Polling | 5 secondes | Intervalle minimum entre les requêtes de polling du token depuis l’appareil |
| Longueur du Code Utilisateur | 8 caractères | Alphanumérique, majuscule, facile à lire et taper |
Implémentation
JavaScript SDK
// É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
- Paramètres OAuth2 Avancés — Configuration du Device Flow dans la Console
- CIBA (Authentification Backchannel) — Autre flux pour scénarios découplés
- Identifiants M2M — Authentification sans utilisateur