MSAL は低レベルの OAuth2 ライブラリではありません。 MSAL は、リフレッシュ トークン (RT) の概念を内部で処理し、ユーザーが意識しなくて済むようにします。 そのため、MSAL Pythonを使用してプロジェクトを開始し、その 3 つの手順の使用パターン (具体的には手順 2) に従っている場合は、RT を格納する場所、検索方法、更新するタイミングを把握し、注意する必要もありません。 MSAL Pythonはトークン キャッシュに関するすべてのハード作業を自動的に行うだけで、エンド ユーザーには最小限のサインイン プロンプトが表示されます。
ただし、既存のプロジェクトで他の OAuth2 ライブラリ (ADAL Pythonを含むがこれらに限定されない) を使用していて、そのプロジェクトを MSAL Pythonに移行する場合は、既存のエンド ユーザーが再度サインインする必要がないように、それらの RP を MSAL Pythonに移行することもできます。
MSAL Python 0.6.0 以降では、その方法の1つは、MSAL Python を使用して以前の RT を使って新しいアクセス トークンを取得し、新しい RT が返されると、MSAL がそれを通常どおり保存するというものです。
このメソッドは一般的ではないシナリオを対象としているため、公式の API サーフェスでは簡単にアクセスできません。
内部ヘルパー app.clientを介して呼び出す必要があります。また、その名前付け規則も他の 公式 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.
このメソッドは、更新トークンを使用できるさまざまな統合シナリオにも使用できます。
ADAL Pythonから MSAL Pythonへの移行
相違点
開発者向け Azure AD (v1.0) エンドポイント (および ADAL Python) について既に理解している場合は、Microsoft ID プラットフォーム (v2.0) エンドポイントの違いを読んでください。
スコープであり、リソースではない
ADAL Pythonはリソースのトークンを取得しますが、MSAL Pythonはスコープのトークンを取得します。 MSAL Pythonの API サーフェスには、リソース パラメーターがなくなりました。 必要なアクセス許可と要求されるリソースを宣言する文字列の一覧としてスコープを指定する必要があります。 既知のスコープは、Microsoft Graphのスコープです。
/.default スコープ サフィックスを使用すると、アプリを v1.0 エンドポイント (ADAL) から Microsoft ID プラットフォーム エンドポイント (MSAL) に移行するのに役立ちます。 たとえば、 https://graph.microsoft.com/.default のスコープ値は、v1.0 エンドポイント resource=https://graph.microsoft.comと機能的に同じです。 リソースが URL フォームに含まれていなくても、フォームのリソース ID が resource_id = "XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX"場合でも、 scope = [ resource_id + "/.default" ]を使用できます。
リファレンス: