Device code : diviser pour mieux authentifier

Il n’est pas toujours possible d’ouvrir un navigateur sur le device sur lequel nous avons besoin de nous authentifier : cela peut concerner, par exemple, un outil en ligne de commande via une connexion SSH, une télévision… Dans ces cas-là, il est nécessaire d’utiliser un flow permettant de réaliser l’authentification via un autre canal et de relier cette authentification au device. Ce flow-là s’appelle le Device Code. Si vous travaillez avec Azure par exemple, c’est l’un des flows standards pour connecter l’Azure cli.
Voici comment cela fonctionne. L’application cliente interroge le serveur d’identité et le serveur lui renvoie deux données :
- Le user code, qu’il faut ensuite transmettre à l’utilisateur (c’est la fameuse « chaîne de caractères » qu’il faut garder) ;
- Le device code, qui servira à « identifier la connexion ». L’application cliente doit le présenter en interrogeant le serveur d’identité pour savoir si l’utilisateur s’est bien authentifié.
Par exemple, avec Postman, en utilisant un compte Microsoft (consulter la documentation Microsoft pour accéder aux requêtes) :
Une fois que l’utilisateur a réussi à s’authentifier via ce code, la prochaine interrogation du serveur via l’application cliente va lui retourner l’access et le refresh token de l’utilisateur.
Avant l’authentification :
Une fois l’authentification réalisée :
On retrouve ensuite un flow Classique : il suffit de rafraîchir l’ « access_token » avec le « refresh_token ».
Pour le développement, prenons l’exemple très simple d’une application console en utilisant la librairie Microsoft (Microsoft.identity.client) permettant de gérer les flux d’authentification/autorisation dans les applications clientes (mobile, daemon, desktop) :
1. Créer l’application console en utilisant un projet correspondant dans Visual Studio :
2. Ajouter le package Microsoft.Identity.Client:
3. Créer ensuite l’objet « application public » de la librairie qui servira à faire les appels en passant les informations nécessaires de notre application Azure AD (voir notre article précédent pour créer cette application ) :
4. Lancer l’acquisition du token à l’aide du flow device code à l’aide de la méthode « AcquireTokenWithDeviceCode ». Celle-ci va donc, dans un premier temps, récupérer les codes (User et Device) nécessaires, comme expliqué précédemment, puis réaliser les actions de « polling » afin de surveiller le résultat de l’authentification. Cette méthode étant asynchrone, il convient de modifier la signature du main() de notre application. Dans le callback, nous en profitons pour passer le message fourni par Azure AD à l’utilisateur puis attendre le résultat de l’authentification.
5. A noter: il faut aussi passer les scopes d’autorisation demandés. Pour notre exemple, nous reprendrons ceux d’accès aux informations de l’utilisateur à travers les API MS Graph :
6. Nous avons maintenant notre access token (AccessToken) disponible. Nous pouvons l’utiliser, par exemple, dans un appel au MSGraph :
7. En exécutant le projet on obtient :
8. En accédant à l’url communiquée, on est invité à renseigner le code fourni :
9. Puis à s’authentifier :
10. L’application console détecte l’action (grâce au polling), continue son exécution, appelle MS Graph et affiche nos informations utilisateurs :
Pour aller plus loin, il serait bon de gérer l’ensemble des exceptions (expiration du code, annulation…) ainsi que la vérification dans le cache si l’utilisateur ne s’est pas déjà connecté.
Pour cela, vous trouverez un exemple plus complet sur GitHub.
Une démo en vidéo pour aller plus loin
Vous souhaitez appliquer tous les principes présentés lors de ce Mois de l’Identité ? Vous avez besoin de précisions sur une manipulation ? Nos experts ont partagé leur savoir-faire lors d’un webinaire sur l’authentification. Le replay est disponible ici !