教程:调用受保护的 API 并显示结果

上一教程中,你向应用程序添加了登录和注销体验。 现在可以基于这些功能进行构建,使登录用户能够调用受保护的 Web API。 为达到本教程的目的,你将调用 Microsoft Graph API 并显示已登录用户的个人资料信息。

本教程的内容:

  • 添加代码来调用受保护的下游 API
  • 运行和测试应用程序

调用 API 并显示结果

若要调用受保护的 API,应首先通过调用 auth.get_token_for_user 来获取当前用户的访问令牌,如下所示:

@app.route("/call_downstream_api")
def call_downstream_api():
    token = auth.get_token_for_user(app_config.SCOPE)
    if "error" in token:
        return redirect(url_for("login"))
    # Use access token to call downstream api
    api_result = requests.get(
        app_config.ENDPOINT,
        headers={'Authorization': 'Bearer ' + token['access_token']},
        timeout=30,
    ).json()
    return render_template('display.html', result=api_result)

当用户导航到 /call_downstream_api URL 路由时,Flask 将调用 call_downstream_api() 函数,该函数会先尝试使用 auth.get_token_for_user(app_config.SCOPE) 获取访问令牌。 如果令牌中存在身份验证问题或任何错误,将用户重定向到登录页以重新进行身份验证。

如果应用成功获取访问令牌,会使用 requests.get(...) 方法向下游 API 发出 HTTP 请求。 在该请求中,我们的下游 API URL 在 app_config.ENDPOINT 中指定。 还可以在请求标头的 Authorization 字段中传递访问令牌。

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

添加代码以运行应用

要运行应用,请在 app.py 文件的末尾添加以下代码片段。

if __name__ == "__main__":
    app.run()

测试应用

按照以下步骤在 Web 应用中测试登录、调用 API 和注销体验:

  1. (如果还未执行)将 .env.sample 文件中的占位符值替换为 Microsoft Entra 应用注册详细信息(客户端 ID、客户端密码和颁发机构 URL)

  2. 为应用创建一个虚拟环境:

    py -m venv .venv
    .venv\scripts\activate
    
  3. 使用 pip 安装要求:

    pip install -r requirements.txt
    
  4. 从命令行运行应用。 确保应用与之前配置的重定向 URI 在同一端口上运行。

    flask run --host=localhost --port=5000
    
  5. 复制终端中显示的 https URL(例如 https://localhost:5000),并将其粘贴到浏览器中。 建议使用私密浏览器或无痕浏览器会话。

  6. 显示登录窗口后,提供用于登录的帐户,然后选择“下一步”:

    显示登录屏幕的屏幕截图。

  7. 浏览器将重定向以让你提供帐户密码。 输入密码,然后选择“登录”。

    此时,因组织所需安全信息的差异,登录流可能会有所不同,例如可能使用验证器应用进行多重身份验证。

  8. 对于“保持登录状态”,可以选择“否”或“是”。

  9. 该应用程序将请求权限,以保持访问你已授权访问的数据、登录和阅读配置文件的权限。 选择“接受”来同意这些权限。

  10. 随即显示以下屏幕截图,指示已登录到应用程序:

    显示已登录用户的屏幕截图。

  11. 要调用受保护的 API 并显示结果,选择“调用下游 API”。 成功调用 Microsoft Graph API 后会返回有关已登录用户的信息,如下所示:

    显示成功的 API 调用结果的屏幕截图。

从应用退出登录

  1. 选择“退出登录”,从应用退出登录
  2. 系统将提示你选取要退出登录的帐户。 选择用于登录的帐户。
  3. 此时会显示一条消息,指示你已退出登录。现在可以关闭浏览器窗口。

另请参阅

生成的应用使用标识库,该库抽象化了适用于 Python 的 Microsoft 身份验证库 (MSAL) 的大部分详细信息。 有关如何在不同方案中使用 MSAL Python 的详细信息,请参阅 MSAL Python 文档