将 Microsoft 365 登录集成到 Flask Web 应用程序中

将 Microsoft 365 登录集成到 Flask Web 应用程序中
将 Microsoft 365 登录集成到 Flask Web 应用程序中

设置 Microsoft 365 身份验证

在开发用于教育目的的 Web 应用程序时,集成 Microsoft 365 电子邮件等机构资源可以增强用户体验并简化登录流程。当应用程序需要与大学 IT 政策保持一致时,这种集成特别有用,这可能会限制根据大学证书创建应用程序。

在这种情况下,使用个人 Microsoft Azure 帐户来设置应用程序是一个实用的解决方案。然而,可能会出现挑战,例如尝试使用大学电子邮件登录时的租户限制问题。这就需要一种策略来管理不同租户的用户帐户,而不影响应用程序的功能或安全性。

命令 描述
oauth.remote_app() 为 OAuth 初始化一个新的远程应用程序实例;它用于处理与 OAuth 提供商的通信。
flask_oauthlib.client.OAuth 用于集成 OAuth 服务提供商的 Flask 扩展,使通过 OAuth 协议进行身份验证变得更加容易。
authorized_response() 作为 Flask-OAuthlib 的一部分,此方法从回调函数中检索授权的 OAuth 响应。
session['oauth_token'] 用于在会话中存储 OAuth 令牌以供以后访问,这对于管理用户会话和身份验证状态至关重要。
microsoft.authorize() 一种重定向到 OAuth 提供程序的授权 URL 的方法,用户可以在其中对应用程序进行授权。
url_for() Flask 中的辅助函数,为给定的视图函数生成端点。它对于生成重定向 URL 很有用。

解释 Flask 与 Microsoft 365 身份验证的集成

前端和后端脚本一起促进将 Microsoft 365 登录集成到 Flask Web 应用程序中。在前端,一个简单的 HTML 页面会显示一个按钮,单击该按钮会触发 JavaScript 函数,将用户重定向到后端进行身份验证。这个过程开始于 loginWithMicrosoft() 函数,它将窗口位置更改为 Flask 处理的后端路由。后端脚本使用 FlaskFlask-OAuthlib 使用 Microsoft 的身份平台管理 OAuth 流程。

在后台, oauth.remote_app() 命令使用应用程序凭据设置与 Microsoft 的 OAuth 端点的连接。这 microsoft.authorize() 该函数通过将用户重定向到 Microsoft 的授权页面来启动身份验证过程。用户登录并授予必要的权限后,OAuth 提供程序使用中指定的回调 URL 将它们发送回应用程序 url_for('authorized')。这 authorized_response() 方法处理此回调,检索确认身份验证和维护用户会话所需的访问令牌。

前端 Microsoft 365 身份验证接口

用于前端的 HTML 和 JavaScript

<html>
<head>
<title>Login with Microsoft</title>
</head>
<body>
<button onclick="loginWithMicrosoft()">Sign In with Microsoft</button>
<script>
function loginWithMicrosoft() {
    window.location.href = '/auth/microsoft';
}
</script>
</body>
</html>

Microsoft 365 的后端身份验证流程

后端使用Python和Flask

from flask import Flask, redirect, url_for, session
from flask_oauthlib.client import OAuth
import os

app = Flask(__name__)
app.secret_key = 'development'
oauth = OAuth(app)

microsoft = oauth.remote_app(
    'microsoft',
    consumer_key='YOUR_APP_ID',
    consumer_secret='YOUR_APP_SECRET',
    request_token_params={'scope': 'User.Read'}
    base_url='https://graph.microsoft.com/v1.0/',
    request_token_url=None,
    access_token_method='POST',
    access_token_url='https://login.microsoftonline.com/common/oauth2/v2.0/token',
    authorize_url='https://login.microsoftonline.com/common/oauth2/v2.0/authorize'
)

@app.route('/')
def index():
    return '<h1>Welcome to the Flask App</h1>' + '<a href="/login">Login with Microsoft</a>'

@app.route('/login')
def login():
    return microsoft.authorize(callback=url_for('authorized', _external=True))

@app.route('/login/authorized')
def authorized():
    response = microsoft.authorized_response()
    if response is None or response.get('access_token') is None:
        return 'Access denied: reason={0} error={1}'.format(
            request.args['error'], request.args['error_description'])
    session['oauth_token'] = (response['access_token'], '')
    return 'Logged in as id={0}'.format(session['oauth_token'])

@microsoft.tokengetter
def get_microsoft_oauth_token():
    return session.get('oauth_token')

if __name__ == '__main__':
    app.run(debug=True)

Flask 中 Microsoft 365 身份验证的高级设置

为了解决在不使用大学管理的电子邮件的情况下集成 Microsoft 365 登录的问题,必须了解 Azure 中多租户应用程序的概念。多租户应用程序允许来自多个 Azure AD 租户的用户访问该应用程序,这对于学生可能拥有不同域电子邮件的大学环境来说是理想的选择。此设置需要将 Azure 应用程序配置为接受来自任何 Azure AD 租户的登录,这是通过将应用程序清单中的“signInAudience”设置为“AzureADMultipleOrgs”来完成的。

此配置更改允许学生使用他们的大学电子邮件,即使应用程序最初是使用个人电子邮件创建的。它还简化了管理,因为开发人员不需要单独将每个用户添加到租户。此方法利用 Azure 身份管理服务的灵活性来确保教育应用程序中更广泛的可访问性和无缝集成。

有关 Flask 应用中 Microsoft 365 集成的常见问题

  1. 什么是 Azure AD 多租户身份验证?
  2. Azure AD 多租户身份验证允许应用程序为来自多个 Azure AD 租户的用户提供服务,而不仅仅是注册应用程序的租户。
  3. 如何为 Azure 多租户配置 Flask 应用程序?
  4. 您需要修改 Azure 中的应用程序注册,以通过在清单中设置“signInAudience”来接受来自任何 Azure AD 租户的登录。
  5. 使用有什么好处 oauth.remote_app() 在烧瓶中?
  6. 此功能通过管理 OAuth 流程(包括令牌检索和存储)简化了与 OAuth 提供商的连接。
  7. 为什么用户可能会收到错误消息,指出租户中不存在其帐户?
  8. 如果应用程序未设置为多租户访问,或者用户未在租户中注册为外部用户,通常会发生这种情况。
  9. 如何处理 Flask 身份验证过程中的错误?
  10. 在中实施错误处理 authorized_response() 函数来捕获并响应错误,例如访问拒绝或丢失令牌。

关于 Microsoft 365 身份验证集成的最终想法

总之,在不使用大学电子邮件的情况下将 Microsoft 365 登录集成到 Flask 应用程序涉及使用个人凭据设置 Azure 应用程序并将其配置为多租户访问。这种方法不仅规避了大学可能对使用官方电子邮件创建应用程序施加的限制,而且还简化了不同租户的用户的登录过程。通过遵循 OAuth 最佳实践并有效处理潜在错误,开发人员可以提供无缝且安全的用户体验。