Migrer des jetons d’actualisation existants vers msAL Python

MSAL n’est pas une bibliothèque OAuth2 de bas niveau. MSAL encapsule et masque le concept de jeton d’actualisation (RT) loin de vous. Par conséquent, si vous avez démarré votre projet avec MSAL Python et que vous suivez son modèle d'utilisation en 3 étapes (en particulier, l'étape 2), vous n'avez même pas besoin de savoir où stocker un rt, comment le rechercher et quand le mettre à jour. MSAL Python se charge automatiquement de tout le travail complexe de mise en cache des jetons pour vous, et votre utilisateur final ne verra qu’un minimum d’invites de connexion.

Toutefois, si votre projet existant utilisait d’autres bibliothèques OAuth2 (y compris, mais pas limités aux Python ADAL) et que vos RT étaient stockés ici, et que vous souhaitez maintenant migrer votre projet vers MSAL Python, vous pouvez également migrer ces RT dans MSAL Python afin que vos utilisateurs finaux existants n’aient pas besoin de se reconnecter.

À partir de MSAL Python 0.6.0, l’une des façons de le faire, consiste à utiliser MSAL Python pour acquérir un nouveau jeton d’accès avec la version RT précédente, puis quand un nouveau rt revient, MSAL le stocke de la manière habituelle. Comme cette méthode est destinée aux scénarios qui ne sont pas typiques, il n’est pas facilement accessible avec la surface d’API officielle. Vous devrez l’appeler via un utilitaire interne app.client, et sa convention de nommage est également légèrement différente de celle de ces autres API officielles.

from msal import PublicClientApplication

def get_preexisting_rt_and_their_scopes_from_elsewhere(...):
    raise NotImplementedError("You will need to implement this by yourself")

app = PublicClientApplication(..., token_cache=...)

for old_rt, old_scope in get_preexisting_rt_and_their_scopes_from_elsewhere(...):
    # Assuming the old scope could be a space-delimited string,
    # in MSAL we expect a list, like ["scope1", "scope2"].
    scopes = old_scope.split()
        # If your old RT came from ADAL Python which uses resource rather than scope,
        # you need to somehow convert your v1 resource into v2 scopes
        # See /azure/active-directory/develop/azure-ad-endpoint-comparison#scopes-not-resources
        # You can probably just append "/.default" to your v1 resource to form a scope
        # See /azure/active-directory/develop/v2-permissions-and-consent#the-default-scope

    result = app.client.obtain_token_by_refresh_token(old_rt, scope=scopes)
    # Providing that the above function call would succeed, the new token(s) would be returned,
    # a new RT would be issued by Microsoft Identity platform and be stored in new msal cache.

Vous pouvez également utiliser cette méthode pour différents scénarios d’intégration dans lesquels vous disposez d’un jeton d’actualisation.

Migrer de Python ADAL vers MSAL Python

Différences

Si vous êtes déjà familiarisé avec le point de terminaison Azure AD pour les développeurs (v1.0) (et les Python ADAL), vous souhaiterez peut-être lire Ce qui est différent du point de terminaison Plateforme d'identités Microsoft (v2.0) ?.

Des portées, pas des ressources

ADAL Python acquiert des jetons pour les ressources, alors que MSAL Python en acquiert pour les étendues. La surface de l’API de MSAL Python ne comporte plus le paramètre resource. Vous devez fournir des portées sous la forme d’une liste de chaînes de caractères qui déclarent les autorisations et les ressources demandées. Les étendues connues sont les étendues du Microsoft Graph.

Vous pouvez utiliser le suffixe d’étendue /.default pour faciliter la migration de vos applications du point de terminaison v1.0 (ADAL) vers le point de terminaison de la plateforme d’identités Microsoft (MSAL). Par exemple, une valeur d’étendue https://graph.microsoft.com/.default est fonctionnellement identique aux points de terminaison resource=https://graph.microsoft.comv1.0. Même si votre ressource n’était pas sous forme d’URL, mais sous forme d’ID de ressource de la forme resource_id = "XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX", vous pouvez toujours utiliser scope = [ resource_id + "/.default" ].

Référence :

Mappage d’API

API dans ADAL Python Correspond globalement à l’API de MSAL Python
AuthenticationContext PublicClientApplication ou ConfidentialClientApplication
N/A get_authorization_request_url()
acquire_token_with_authorization_code() acquire_token_by_authorization_code()
acquire_token() acquire_token_silent()
acquire_token_with_refresh_token() N/A (voir les détails de cette section)
acquire_user_code() initiate_device_flow()
acquire_token_with_device_code() et cancel_request_to_get_token_with_device_code() acquire_token_by_device_flow()
acquire_token_with_username_password() acquire_token_by_username_password()
acquire_token_with_client_credentials() et acquire_token_with_client_certificate() acquire_token_for_client()
N/A acquire_token_on_behalf_of()
TokenCache() SerializableTokenCache()
N/A Cache avec persistance, disponible à partir des extensions MSAL