Migrace existujících obnovovacích tokenů do Python MSAL

MSAL není nízkoúrovňová knihovna OAuth2. MSAL zapouzdřuje a skrývá koncept obnovovacího tokenu (RT) před vámi. Takže pokud jste projekt spustili s MSAL Python a postupovali podle jeho 3stupňového vzorce použití (konkrétně v kroku 2), nemusíte ani vědět, kam uložit RT, jak ho vyhledat a kdy ho aktualizovat. MSAL Python jen automaticky provede veškerou tvrdou práci na ukládání tokenů do mezipaměti za vás a koncový uživatel uvidí minimální množství výzvy k přihlášení.

Pokud ale váš stávající projekt používal jiné knihovny OAuth2 (včetně Python ADAL), a vaše RT se tam uložily a teď chcete projekt migrovat na MSAL Python, můžete je také chtít migrovat do knihovny MSAL Python tak, aby se stávající koncoví uživatelé nemuseli znovu přihlašovat.

Počínaje verzí MSAL Python 0.6.0 je jedním ze způsobů, jak to provést, použití MSAL Python k získání nového přístupového tokenu pomocí předchozího RT, a jakmile se vrátí nový RT, MSAL jej uloží obvyklým způsobem. Vzhledem k tomu, že tato metoda je určená pro scénáře, které nejsou typické, není snadno přístupná s oficiálním povrchem rozhraní API. Budete ho muset volat prostřednictvím interního pomocníka app.clienta jeho zásady pojmenování se také mírně liší od těch ostatních oficiálních rozhraní API.

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.

Tuto metodu můžete použít také pro různé scénáře integrace, ve kterých máte k dispozici obnovovací token.

Migrace z Python ADAL na Python MSAL

Differences

Pokud už znáte koncový bod Azure AD pro vývojáře (v1.0) (a Python ADAL), můžete si přečíst, co se liší od koncového bodu Microsoft identity platform (v2.0)?

Obory, nikoli prostředky

ADAL Python získává tokeny pro prostředky, ale MSAL Python získává tokeny pro obory. Rozhraní API v knihovně MSAL Python již neobsahuje parametr resource. Musíte uvést rozsahy jako seznam řetězců, které určují požadovaná oprávnění a požadované prostředky. Dobře známé obory jsou obory Microsoft Graph.

Příponu oboru /.default můžete použít k usnadnění migrace aplikací z koncového bodu v1.0 (ADAL) do koncového bodu platformy Microsoft Identity (MSAL). Například hodnota oboru https://graph.microsoft.com/.default je z funkčního hlediska stejná jako koncové body verze 1.0 resource=https://graph.microsoft.com. I když váš prostředek nebyl ve formě URL, ale jako ID prostředku ve tvaru resource_id = "XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX", stále můžete použít scope = [ resource_id + "/.default" ].

Referenční informace:

Mapování rozhraní API

API v ADAL pro Python Zhruba odpovídá rozhraní API v MSAL Python
AuthenticationContext PublicClientApplication nebo 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() Není k dispozici (viz podrobnosti v této části)
acquire_user_code() initiate_device_flow()
acquire_token_with_device_code() a 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() a acquire_token_with_client_certificate() acquire_token_for_client()
N/A acquire_token_on_behalf_of()
TokenCache() SerializableTokenCache()
N/A Trvalá mezipaměť, dostupná v MSAL Extensions