Plateforme d’identités Microsoft et flux d’octroi d’autorisation d’appareil OAuth 2.0

La plateforme d’identités Microsoft prend en charge l’octroi d’autorisation d’appareil, ce qui permet aux utilisateurs de se connecter à des appareils à entrée limitée comme une télévision connectée, un appareil IoT ou une imprimante. Pour activer ce flux, l’appareil demande à l’utilisateur de consulter une page web dans un navigateur sur un autre appareil pour se connecter. Lorsque l’utilisateur est connecté, l’appareil peut obtenir des jetons d’accès et actualiser les jetons si nécessaire.

Cet article explique comment programmer directement par rapport au protocole dans votre application. Dans la mesure du possible, nous vous recommandons d’utiliser les bibliothèques d’authentification Microsoft (MSAL) prises en charge au lieu d’acquérir des jetons et d’appeler des API web sécurisées. Vous pouvez également consulter des exemples d’applications utilisant MSAL.

Conseil

Essayez d’exécuter cette requête dans Postman
Essayez d’exécuter cette requête et plus encore dans Postman -- n’oubliez pas de remplacer les jetons et les ID !

Schéma de protocole

L’ensemble du flux de code de l’appareil est illustré dans le diagramme suivant. Chaque étape est expliquée tout au long de cet article.

Flux de code d’appareil

Requête d’autorisation de l’appareil

Le client doit d’abord rechercher sur le serveur d’authentification un appareil et un code utilisateur, utilisés pour lancer l’authentification. Le client collecte cette requête à partir du point de terminaison /devicecode. Dans la demande, le client doit également inclure les autorisations dont il a besoin d’obtenir auprès de l’utilisateur.

À partir du moment où la demande est envoyée, l’utilisateur a 15 minutes pour se connecter. Il s'agit de la valeur par défaut de l'objet expires_in. La demande doit être effectuée seulement quand l’utilisateur indique qu’il est prêt à se connecter.

// Line breaks are for legibility only.

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode
Content-Type: application/x-www-form-urlencoded

client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&scope=user.read%20openid%20profile

Paramètre Condition Description
tenant Obligatoire Peut être /common, /consumers ou /organizations. Il peut également s’agir du locataire d’annuaire dont vous souhaitez demander une autorisation au format GUID ou de nom convivial.
client_id Obligatoire L’ID (client) d’application attribué à votre application par l’environnement Inscriptions d’applications du portail Azure.
scope Obligatoire Liste séparée par des espaces d’ étendues pour lesquelles vous souhaitez que l’utilisateur donne son consentement.

Réponse d’autorisation d’appareil

Une réponse positive est un objet JSON contenant les informations requises pour permettre à l’utilisateur de se connecter.

Paramètre Format Description
device_code String Chaîne longue utilisée pour vérifier la session entre le client et le serveur d’autorisation. Ce client est utilisé par le client pour demander le jeton d’accès au serveur d’autorisation.
user_code String Chaîne courte présentée à l’utilisateur, utilisée pour identifier la session sur un appareil secondaire.
verification_uri URI URI auquel l’utilisateur doit accéder avec le user_code pour pouvoir se connecter.
expires_in int Nombre de secondes avant l’expiration de device_code et user_code.
interval int Nombre de secondes d’attente du client entre chaque requête d’interrogation.
message String Chaîne lisible par l’homme contenant des instructions pour l’utilisateur. Elle peut être localisée en incluant un paramètre de requête dans la requête sous la forme ?mkt=xx-XX, en remplissant le code de langue approprié.

Notes

Le champ de réponse verification_uri_complete n’est ni inclus ni pris en charge pour l’instant. Nous le mentionnons car, si vous lisez la norme, vous voyez que verification_uri_complete est répertorié comme une partie facultative de la norme de flux de code d’appareil.

Authentification de l’utilisateur

Après avoir reçu user_code et verification_uri, le client les présente aux utilisateurs et leur demande de se servir de leur téléphone mobile ou de leur navigateur PC pour se connecter.

Si l’utilisateur s’authentifie avec un compte personnel avec /common ou /consumers, il est invité à se reconnecter pour transférer l’état d’authentification à l’appareil. C’est parce que l’appareil ne peut pas accéder aux cookies de l’utilisateur. Il est également invité à consentir aux autorisations demandées par le client. Cela ne s’applique cependant pas aux comptes professionnels ou scolaires utilisés pour l’authentification.

Tandis que l’utilisateur s’authentifie auprès de verification_uri, le client doit interroger le point de terminaison /token pour le jeton demandé à l’aide du device_code.

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:device_code&client_id=6731de76-14a6-49ae-97bc-6eba6914391e&device_code=GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8...
Paramètre Obligatoire Description
tenant Obligatoire Même locataire ou alias de locataire que celui utilisé dans la demande initiale.
grant_type Obligatoire Doit être urn:ietf:params:oauth:grant-type:device_code
client_id Obligatoire Doit correspondre au client_id utilisé dans la requête initiale.
device_code Obligatoire device_code retourné dans la requête d’autorisation d’appareil.

Erreurs attendues

Le flux de code de l’appareil étant un protocole d’interrogation, les erreurs fournies au client doivent être attendues avant la fin de l’authentification de l’utilisateur.

Error Description Action du client
authorization_pending L’utilisateur n’a pas encore terminé l’authentification, mais n’a pas annulé le flux. Répétez la requête après interval secondes minimum.
authorization_declined L’utilisateur final a refusé la requête d’autorisation. Arrêtez l’interrogation et revenez à un état non authentifié.
bad_verification_code Le device_code envoyé au point de terminaison /token n’a pas été reconnu. Vérifiez que le client envoie le device_code approprié dans la requête.
expired_token La valeur de expires_in a été dépassée et l’authentification n’est plus possible avec device_code. Arrêtez l’interrogation et revenez à un état non authentifié.

Réponse d’authentification réussie

Une réponse de jeton réussie se présente ainsi :

{
    "token_type": "Bearer",
    "scope": "User.Read profile openid email",
    "expires_in": 3599,
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4...",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctOD..."
}
Paramètre Format Description
token_type String Toujours Bearer.
scope Chaînes séparées par un espace Si un jeton d’accès est retourné, répertorie les étendues dans lesquelles le jeton d’accès est valide.
expires_in int Nombre de secondes pendant lesquelles le jeton d’accès inclus est valide.
access_token Chaîne opaque Émise pour les étendues qui ont été demandées.
id_token JWT Émis si le paramètre scope d’origine inclut l’étendue openid.
refresh_token Chaîne opaque Émise si le paramètre scope d’origine inclut offline_access.

Vous pouvez utiliser le jeton d’actualisation pour acquérir de nouveaux jetons d’accès et actualiser des jetons avec le même flux détaillé décrit dans la documentation du flux de code OAuth.

Avertissement

N’essayez pas de valider ou de lire des jetons pour des API dont vous n’êtes pas propriétaire, y compris les jetons de cet exemple, dans votre code. Les jetons associés aux services Microsoft peuvent utiliser un format spécial qui n’est pas validé comme jeton JWT, et peuvent également être chiffrés pour les utilisateurs consommateurs (de comptes Microsoft). Même si la lecture des jetons est un outil utile de débogage et d’apprentissage, n’y associez pas de dépendances dans votre code ou tenez compte des spécificités des jetons qui ne correspondent pas à une API que vous contrôlez.