Поделиться через


Руководство: Авторизация пользователей в веб-приложении Python Flask с помощью платформы идентификации Microsoft

Применяется: Зелёный круг с символом белой галочки. Арендаторы рабочего пространства Зелёный круг с символом белой галочки. Внешние арендаторы (дополнительные сведения)

В этом руководстве описано, как защитить веб-приложение Python Flask.

Изучив это руководство, вы:

  • Создание проекта Python Flask
  • Установка необходимых зависимостей
  • Настройка веб-приложения Flask для использования платформы удостоверений Майкрософт для проверки подлинности
  • Тестирование интерфейса входа и выхода в веб-приложении Flask

Необходимые условия

  • Арендатор рабочей силы. Вы можете использовать каталог по умолчанию или настроить нового арендатора.
  • Зарегистрируйте новое приложение в Центре администрирования Microsoft Entra, настроенное только для учетных записей в этом каталоге организации. Дополнительные сведения см. в статье "Регистрация приложения ". Запишите следующие значения на странице обзора приложения для последующего использования:
    • Идентификатор приложения (клиента)
    • Идентификатор каталога (арендатора)
  • Добавьте секрет клиента в регистрацию приложения. Не используйте секреты клиента в рабочих приложениях. Вместо этого используйте сертификаты или федеративные учетные данные. Дополнительные сведения см. в статье о добавлении учетных данных в приложение.

Создание проекта Flask

  1. Создайте папку для размещения приложения Flask, например flask-web-app.

  2. Откройте окно консоли и перейдите в папку вашего веб-приложения Flask с помощью команды

    cd flask-web-app
    
  3. Настройка виртуальной среды

    В зависимости от операционной системы выполните следующие команды, чтобы настроить виртуальную среду и активировать ее:

    Для операционной системы Windows:

    py -m venv .venv
    .venv\scripts\activate
    

    Для операционной системы macOS или Linux:

    python3 -m venv .venv
    source .venv/bin/activate
    

Установка зависимостей приложений

Чтобы установить зависимости приложений, выполните следующие команды:

pip install flask
pip install python-dotenv
pip install requests
pip install "ms_identity_python[flask] @ git+https://github.com/azure-samples/ms-identity-python@0.9"

Библиотека ms_identity_python , устанавливаемая автоматически, устанавливает библиотеку проверки подлинности Майкрософт (MSAL) для Python в качестве его зависимостей. MSAL Python — это библиотека, которая позволяет выполнять проверку подлинности пользователей и управлять маркерами доступа.

После установки необходимых библиотек обновите файл требований, выполнив следующую команду:

pip freeze > requirements.txt

Добавление конфигураций

  1. Создайте env*-файл в корневой папке для безопасного хранения конфигурации приложения. Файл .env должен содержать следующие переменные среды:

    CLIENT_ID="<Enter_your_client_id>"
    CLIENT_SECRET="<Enter_your_client_secret>"
    AUTHORITY="https://login.microsoftonline.com/<Enter_tenant_id>"
    REDIRECT_URI="<Enter_redirect_uri>"
    

    Замените заполнители следующими значениями:

    • Замените <Enter_your_client_id> идентификатором приложения (клиента) зарегистрированного клиентского веб-приложения.
    • Замените <Enter_tenant_id> на идентификатор Каталога (Арендатора), где вы зарегистрировали веб-приложение.
    • Замените <Enter_your_client_secret> значение секрета клиента для созданного веб-приложения. В этом руководстве мы используем секреты для демонстрационных целей. В рабочей среде используйте более безопасные подходы, такие как сертификаты или полномочия федеративной идентификации.
    • Замените <Enter_redirect_uri> на URI перенаправления, который вы зарегистрировали ранее. В этом руководстве путь URI перенаправления устанавливается на http://localhost:3000/getAToken.
  2. Создайте файл app_config.py для чтения переменных среды и добавления других необходимых конфигураций.

    import os
    
    AUTHORITY = os.getenv("AUTHORITY")
    CLIENT_ID = os.getenv("CLIENT_ID")
    CLIENT_SECRET = os.getenv("CLIENT_SECRET")
    REDIRECT_URI = os.getenv("REDIRECT_URI")
    SESSION_TYPE = "filesystem" # Tells the Flask-session extension to store sessions in the filesystem. Don't use in production apps.
    

Настройка конечных точек приложения

На этом этапе вы создадите конечные точки веб-приложения и добавьте бизнес-логику в приложение.

  1. Создайте файл с именем app.py в корневой папке.

  2. Импорт необходимых зависимостей в верхней части файла app.py .

    import os
    import requests
    from flask import Flask, render_template
    from identity.flask import Auth
    import app_config
    
  3. Инициализировать приложение Flask и настроить его для использования типа хранилища сеансов, указанного в файле app_config.py .

    app = Flask(__name__)
    app.config.from_object(app_config)
    
  4. Инициализация клиента приложения. Веб-приложение Flask является конфиденциальным клиентом. Мы передаваем секрет клиента, так как конфиденциальные клиенты могут безопасно хранить его. Внутренне библиотека идентификации вызывает класс ConfidentialClientApplication библиотеки MSAL.

    auth = Auth(
        app,
        authority=app.config["AUTHORITY"],
        client_id=app.config["CLIENT_ID"],
        client_credential=app.config["CLIENT_SECRET"],
        redirect_uri=app.config["REDIRECT_URI"]
    )
    
  5. Добавьте необходимые конечные точки в приложение Flask. Веб-приложение использует поток кода авторизации для входа пользователя. Библиотека оболочки MSAL ms_identity_python помогает взаимодействовать с библиотекой MSAL, что упрощает добавление входа и выход в приложение. Мы добавим страницу индекса и защищаем ее с помощью login_required декоратора, предоставленного библиотекой ms_identity_python . Декоратор login_required гарантирует, что только прошедшие проверку подлинности пользователи могут получить доступ к странице индекса.

    @app.route("/")
    @auth.login_required
    def index(*, context):
        return render_template(
            'index.html',
            user=context['user'],
            title="Flask Web App Sample",
        )
    

    Пользователь гарантированно присутствует, так как мы аннотировали это представление с помощью @login_required.

Создание шаблонов приложений

Создайте папку с именем шаблонов в корневой папке. В папке шаблонов создайте файл с именемindex.html. Это домашняя страница приложения. Добавьте следующий код в файл index.html :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <h2>Welcome {{ user.get("name") }}!</h2>

    <img src="https://github.com/Azure-Samples/ms-identity-python-webapp-django/raw/main/static/topology.png" alt="Topology">

    <ul>
    {% if api_endpoint %}
        <!-- If an API endpoint is declared and scopes defined, this link will show. We set this in the call an API tutorial. For this tutorial, we do not define this endpoint. -->
        <li><a href='/call_api'>Call an API</a></li>
    {% endif %}

    <li><a href="{{ url_for('identity.logout') }}">Logout</a></li>
    </ul>

    <hr>
    <footer style="text-align: right">{{ title }}</footer>
</body>
</html>

Запуск и проверка примера веб-приложения

  1. В терминале выполните следующую команду:

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

    Вы можете использовать нужный порт. Этот порт должен быть похож на порт URI перенаправления, зарегистрированного ранее.

  2. Откройте браузер, а затем перейдите к http://localhost:3000. Вы увидите страницу входа.

  3. Войдите с помощью учетной записи Майкрософт, выполнив действия. Вам предлагается указать адрес электронной почты и пароль для входа.

  4. Если приложению нужны какие-либо разрешения, отобразится экран согласия. Приложение запрашивает разрешение на сохранение доступа к данным, к которым вы предоставили доступ, и на вход в систему. Выберите Принять. Этот экран не отображается, если области не определены.

После входа или регистрации вы перенаправляетесь обратно в веб-приложение. Вы увидите страницу, похожую на следующий снимок экрана:

Снимок экрана: пример веб-приложения flask после успешной проверки подлинности.

Выберите выход, чтобы выйти из приложения. Вам будет предложено выбрать учетную запись для выхода. Выберите учетную запись, используемую для входа.

Использование личного домена URL-адреса (необязательно)

Арендаторы для сотрудников не поддерживают пользовательские домены URL.