教程:从 Python Flask Web 应用调用Microsoft图形 API

在本教程中,你将从 Python Flask Web 应用调用 Microsoft 图形 API。 在上一教程中,你向应用程序添加了登录和注销体验。 用户登录后,应用将获取访问令牌以调用Microsoft图形 API。

在本教程中,你将:

  • 更新现有的 Python Flask Web 应用以获取访问令牌
  • 使用访问令牌调用 Microsoft 图形接口 API。

先决条件

完成教程中的步骤 :使用 Microsoft 标识平台向 Python Flask Web 应用添加登录

定义范围和 API 终结点

在此示例中,我们将调用 Microsoft 图形 API 来获取已登录用户的个人资料信息。 如果您的应用位于员工租户中,那么在登录时,用户需要同意应用访问 Microsoft Graph API 所需的权限。 然后,应用使用访问令牌调用 API 并显示结果。

.env 文件中,添加我们调用的终结点以及调用 Microsoft 图形 API 所需的范围:

SCOPE=User.Read
ENDPOINT=https://microsoftgraph.chinacloudapi.cn/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图形 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 请求。 在请求中,我们在 app_config.ENDPOINT 中指定了下游 API URL,并在请求标头的 Authorization 字段中传递访问令牌。

    对下游 API(Microsoft图形 API)的成功请求返回存储在变量中的 api_result JSON 响应,并传递给 display.html 模板进行呈现。

显示 API 结果

模板文件夹中创建名为 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. 如果应用程序需要任何权限,将会显示同意屏幕。 应用程序将请求权限,以维持对你允许访问的数据的访问权限,并将你登录。 选择 接受。 如果未定义作用域,则不会显示此屏幕。

调用 API

  1. 选择主页上的 “调用 API ”链接。 应用调用 Microsoft 图形 API 以获取已登录用户的个人资料信息。 应用显示对 API 的调用结果。

  2. 选择 注销 以注销应用。 系统会提示你选择要从中注销的帐户。 选择用于登录的帐户。

参考资料

ms_identity_python抽象化 MSAL 库的详细信息。 有关详细信息,请参阅 MSAL Python 文档。 此参考资料可帮助你了解如何使用 MSAL Python 初始化应用和获取令牌。