次の方法で共有


チュートリアル: Python Flask Web アプリから Microsoft Graph API を呼び出す

適用対象: 次の内容が従業員テナントに適用されることを示す白いチェック マーク記号が付いた緑の円。 従業員テナント :次の内容が外部テナントに適用されることを示す白いチェック マーク記号が付いた緑の円。 外部テナント (詳細)

このチュートリアルでは、Python Flask Web アプリから Microsoft Graph API を呼び出します。 前の チュートリアルでは、サインインエクスペリエンスとサインアウト エクスペリエンスをアプリケーションに追加しました。 ユーザーがサインインすると、アプリは Microsoft Graph API を呼び出すアクセス トークンを取得します。

このチュートリアルでは、次の操作を行います。

  • 既存の Python Flask Web アプリを更新してアクセス トークンを取得する
  • アクセス トークンを使用して Microsoft Graph API を呼び出します。

[前提条件]

「チュートリアル: Microsoft ID プラットフォームを使用して Python Flask Web アプリにサインインを追加する」の手順を完了します。

スコープと API エンドポイントを定義する

この例では、Microsoft Graph API を呼び出して、サインインしているユーザーのプロファイル情報を取得します。 アプリが従業員テナント内にある場合、サインイン時に、ユーザーは Microsoft Graph API にアクセスするためにアプリで必要なスコープに同意します。 アプリが外部テナントにある場合は、テナント内 のユーザーに代わって管理者の同意を付与してください。 その後、アプリはアクセス トークンを使用して API を呼び出し、結果を表示します。

.env ファイルに、呼び出すエンドポイントと、Microsoft Graph API を呼び出すために必要なスコープを追加します。

SCOPE=User.Read
ENDPOINT=https://graph.microsoft.com/v1.0/me

app_config.py ファイルを更新して、アプリ内の新しい構成を読み取ります。

# other configs go here
SCOPE = os.getenv("SCOPE")
ENDPOINT = os.getenv("ENDPOINT")

保護された API を呼び出す

  1. API エンドポイントをホーム ページに渡します。 これにより、エンドポイントを呼び出します。 次のコード スニペットに示すように、 / ルートを更新します。

    @app.route("/")
    @auth.login_required
    def index(*, context):
        return render_template(
            'index.html',
            user=context['user'],
            title="Flask Web App Sample",
            api_endpoint=os.getenv("ENDPOINT") # added this line
        )
    
  2. 次のコード スニペットに示すように、保護された Microsoft Graph API を呼び出します。 アプリで使用する必要があるスコープの一覧を渡します。 スコープが存在する場合、コンテキストにはアクセス トークンが含まれます。 アクセス トークンは、ダウンストリーム API を呼び出すために使用されます。 app.py ファイルに次のコードを追加します。

    @app.route("/call_api")
    @auth.login_required(scopes=os.getenv("SCOPE", "").split())
    def call_downstream_api(*, context):
        api_result = requests.get(  # Use access token to call a web api
            os.getenv("ENDPOINT"),
            headers={'Authorization': 'Bearer ' + context['access_token']},
            timeout=30,
        ).json() if context.get('access_token') else "Did you forget to set the SCOPE environment variable?"
        return render_template('display.html', title="API Response", result=api_result)
    

    アプリがアクセス トークンを正常に取得すると、 requests.get(...) メソッドを使用してダウンストリーム API に HTTP 要求が行われます。 要求では、ダウンストリーム API URL は app_config.ENDPOINT で指定され、アクセス トークンは要求ヘッダーの Authorization フィールドに渡されます。

    ダウンストリーム API (Microsoft Graph API) への要求が成功すると、 api_result 変数に格納され、レンダリングのために display.html テンプレートに渡される JSON 応答が返されます。

API の結果を表示する

templates フォルダーに display.html という名前のファイルを作成します。 このページには、Microsoft Graph エンドポイントへの呼び出しの結果が表示されます。 display.html ファイルに次のコードを追加します。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Microsoft Identity Python Web App: API</title>
</head>
<body>
    <a href="javascript:window.history.go(-1)">Back</a> <!-- Displayed on top of a potentially large JSON response, so it will remain visible -->
    <h1>{{title}}</h1>
    <pre>{{ result |tojson(indent=4) }}</pre> <!-- Just a generic json viewer -->
</body>
</html>

サンプル Web アプリを実行してテストする

  1. ご利用のターミナルで、次のコマンドを実行します。

    python3 -m flask run --debug --host=localhost --port=3000
    

    選択したポートを使用できます。 このポートは、先ほど登録したリダイレクト URI のポートに似ている必要があります。

  2. ブラウザーを開き、 http://localhost:3000に移動します。 サインイン ページが表示されます。

  3. 手順に従って、Microsoft アカウントでサインインします。 サインインするための電子メール アドレスとパスワードを指定するように求められます。

  4. アプリケーションで必要なスコープがある場合は、同意画面が表示されます。 アプリケーションは、アクセスを許可するデータへのアクセスを維持し、サインインするためのアクセス許可を要求します。 [Accept](承認) を選択します。 スコープが定義されていない場合、この画面は表示されません。

API の呼び出し

  1. ホーム ページで [ API の呼び出し ] リンクを選択します。 アプリは Microsoft Graph API を呼び出して、サインインしているユーザーのプロファイル情報を取得します。 アプリには、API の呼び出しの結果が表示されます。

  2. [ ログアウト ] を選択してアプリからサインアウトします。 サインアウトするアカウントを選択するように求められます。 サインインに使用したアカウントを選択します。

参考資料

ms_identity_pythonは、MSAL ライブラリの詳細を抽象化します。 詳細については、 MSAL Python のドキュメントを参照してください。 このリファレンス 資料は、MSAL Python を使用してアプリを初期化し、トークンを取得する方法を理解するのに役立ちます。