Migreringsguide för ADAL till MSAL för Python

Den här artikeln belyser ändringar som du behöver göra för att migrera en app som använder ADAL (Azure Active Directory Authentication Library) för att använda Microsofts autentiseringsbibliotek (MSAL).

Du kan lära dig mer om MSAL och komma igång med en översikt över Microsoft-autentiseringsbibliotek för Python.

Skillnadshöjdpunkter

ADAL fungerar med slutpunkten Azure Active Directory (Azure AD) v1.0. Microsofts autentiseringsbibliotek (MSAL) fungerar med Microsofts identitetsplattform som tidigare kallades Azure Active Directory v2.0-slutpunkt. Microsofts identitetsplattform skiljer sig från Azure AD v1.0 genom att den:

Stöder:

  • Arbets- och skolkonton (Microsoft Entra ID etablerade konton)

  • Personliga konton (till exempel Outlook.com eller Hotmail.com)

  • Dina kunder som tar med sig sin egen e-post eller sociala identitet (till exempel LinkedIn, Facebook, Google) via Azure AD B2C-erbjudandet

  • Är standarder kompatibla med:

    • OAuth v2.0
    • OpenID Connect (OIDC)

Mer information om MSAL finns i MSAL-översikt.

Omfång, inte resurser

ADAL Python hämtar token för resurser, men MSAL Python hämtar token för omfång. API-ytan i MSAL Python har inte resursparameter längre. Du skulle behöva ange omfång som en lista över strängar som deklarerar önskade behörigheter och resurser som begärs. Om du vill se några exempel på behörighetsomfång, se Microsoft Graphs behörighetsomfång.

Du kan lägga till omfångssuffixet /.default i resursen för att migrera dina appar från V1.0-slutpunkten (ADAL) till Microsofts identitetsplattform (MSAL). För resursvärdet https://graph.microsoft.comför är till exempel motsvarande omfångsvärde https://graph.microsoft.com/.default. Om resursen inte finns i URL-formuläret, men ett resurs-ID i formuläret XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX, kan du fortfarande använda omfångsvärdet som XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX/.default.

Mer information om de olika typerna av omfång finns i artiklarna Behörigheter och medgivande på Microsofts identitetsplattform och Omfång för ett webb-API som accepterar v1.0-token.

Felhantering

ADAL för Python använder undantaget AdalError för att indikera att det har uppstått ett problem. MSAL för Python använder vanligtvis felkoder i stället. Mer information finns i MSAL för Python felhantering.

API-ändringar

I följande tabell visas ett API i ADAL för Python och det som ska användas i msal för Python:

ADAL för Python API MSAL för Python API
AuthenticationContext PublicClientApplication eller ConfidentialClientApplication
N/A acquire_token_interactive
N/A get_authorization_request_url
N/A initiate_auth_code_flow
acquire_token_with_authorization_code() acquire_token_by_auth_code_flow
acquire_token() acquire_token_silent
acquire_token_with_refresh_token() De här två hjälparna är endast avsedda att användas under migreringen : acquire_token_by_refresh_token
acquire_user_code() initiate_device_flow
acquire_token_with_device_code() och 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() och acquire_token_with_client_certificate() acquire_token_for_client
N/A acquire_token_on_behalf_of
TokenCache() SerializableTokenCache
N/A Cache med beständig lagring, är tillgängligt från MSAL Extensions

Migrera befintliga uppdateringstokenar för MSAL Python

MSAL abstraherar begreppet uppdateringstoken. MSAL-Python tillhandahåller en minnesintern tokencache som standard så att du inte behöver lagra, söka efter eller uppdatera uppdateringstoken. Användarna ser också färre inloggningsprompter eftersom uppdateringstoken vanligtvis kan uppdateras utan användarintervention. Mer information om tokencachen finns i Custom token cache serialization in MSAL for Python (Anpassad tokencache-serialisering i MSAL för Python.

Följande kod hjälper dig att migrera dina uppdateringstoken som hanteras av ett annat OAuth2-bibliotek (inklusive men inte begränsat till ADAL-Python) som ska hanteras av MSAL för Python. En anledning till att migrera dessa uppdateringstoken är att förhindra att befintliga användare behöver logga in igen när du migrerar appen till MSAL för Python.

Metoden för att migrera en uppdateringstoken är att använda MSAL för Python för att hämta en ny åtkomsttoken med hjälp av den tidigare uppdateringstoken. När den nya uppdateringstoken returneras lagrar MSAL för Python den i cacheminnet. Eftersom MSAL Python 1.3.0 tillhandahåller vi ett API i MSAL för detta ändamål. Se följande kodfragment, som citeras från ett slutfört exempel på migrering av uppdateringstoken med MSAL Python

import msal
def get_preexisting_rt_and_their_scopes_from_elsewhere():
    # Maybe you have an ADAL-powered app like this
    #   https://github.com/AzureAD/azure-activedirectory-library-for-python/blob/1.2.3/sample/device_code_sample.py#L72
    # which uses a resource rather than a scope,
    # you need to convert your v1 resource into v2 scopes
    # See https://dotnet.territoriali.olinfo.it/azure/active-directory/develop/migrate-python-adal-msal#scopes-not-resources
    # You may be able to append "/.default" to your v1 resource to form a scope
    # See https://dotnet.territoriali.olinfo.it/azure/active-directory/develop/v2-permissions-and-consent#the-default-scope

    # Or maybe you have an app already talking to the Microsoft identity platform,
    # powered by some 3rd-party auth library, and persist its tokens somehow.

    # Either way, you need to extract RTs from there, and return them like this.
    return [
        ("old_rt_1", ["scope1", "scope2"]),
        ("old_rt_2", ["scope3", "scope4"]),
        ]


# We will migrate all the old RTs into a new app powered by MSAL
app = msal.PublicClientApplication(
    "client_id", authority="...",
    # token_cache=...  # Default cache is in memory only.
                       # You can learn how to use SerializableTokenCache from
                       # https://msal-python.readthedocs.io/en/latest/#msal.SerializableTokenCache
    )

# We choose a migration strategy of migrating all RTs in one loop
for old_rt, scopes in get_preexisting_rt_and_their_scopes_from_elsewhere():
    result = app.acquire_token_by_refresh_token(old_rt, scopes)
    if "error" in result:
        print("Discarding unsuccessful RT. Error: ", json.dumps(result, indent=2))

print("Migration completed")