Authentification IMAP Office 365 via OAuth2 et la bibliothèque Python MSAL
L’erreur imaplib.IMAP4.error: AUTHENTICATE failed est survenue parce qu’un point de la documentation n’est pas très clair.
Lors de la configuration du Service Principal via PowerShell, vous devez saisir l’App-ID et un Object-ID. Beaucoup de personnes penseront qu’il s’agit de l’Object-ID visible sur la page de présentation de l’application enregistrée, mais ce n’est pas le cas !
À cet endroit, vous avez besoin de l’Object-ID provenant de « Azure Active Directory → Enterprise Applications → Votre-App → Object-ID »
New-ServicePrincipal -AppId <APPLICATION_ID> -ServiceId <OBJECT_ID> [-Organization <ORGANIZATION_ID>]
Microsoft précise :
L’OBJECT_ID est l’Object ID de la page de présentation du noeud Enterprise Application (portail Azure) pour l’enregistrement de l’application. Ce n’est pas l’Object ID de la page de présentation du noeud App Registrations. Utiliser le mauvais Object ID provoquera un échec d’authentification.
Bien entendu, vous devez également vous occuper des permissions d’API et du reste, mais c’était le point bloquant pour moi.
Reprenons donc les étapes, telles qu’elles sont expliquées dans la page de documentation.
Authenticate an IMAP, POP or SMTP connection using OAuth
-
Enregistrez l’application dans votre tenant
-
Configurez une clé client pour l’application
-
Configurez les permissions d’API, sélectionnez l’onglet « APIs my organization uses » et recherchez « Office 365 Exchange Online » → Application permissions → Choisissez IMAP et IMAP.AccessAsApp
-
Configurez le Service Principal et l’accès complet pour votre application sur la boîte aux lettres
-
Vérifiez que l’IMAP est activé pour la boîte aux lettres
Voici le code que j’utilise pour tester :
import imaplib
import msal
import pprint
conf = {
"authority": "https://login.microsoftonline.com/XXXXyourtenantIDXXXXX",
"client_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX", #AppID
"scope": ['https://outlook.office365.com/.default'],
"secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", #Key-Value
*(Réponse tronquée)*