다음을 통해 공유


자습서: Microsoft ID 플랫폼을 사용하여 Python Flask 웹앱에 사용자 로그인

적용 대상: 이 내용은 워크포스 테넌트에 적용됩니다. 흰색 체크 표시가 있는 녹색 원으로 표시됩니다.이 내용은 외부 테넌트에 적용됩니다. 흰색 체크 표시가 있는 녹색 원으로 표시됩니다. 외부 테넌트(자세한 정보)

이 자습서에서는 Python Flask 웹앱의 보안을 유지하는 방법에 대해 설명합니다.

이 자습서에서는 다음을 수행합니다.

  • Python Flask 프로젝트 만들기
  • 필요한 종속성 설치
  • 인증에 Microsoft ID 플랫폼을 사용하도록 Flask 웹앱 구성
  • Flask 웹앱에서 로그인 및 로그아웃 환경 테스트

필수 구성 요소

  • 인력 임차인입니다. 기본 디렉터리 사용하거나 새 테넌트를 설정할 수 있습니다.
  • 새 앱을 Microsoft Entra 관리 센터에 등록하고, 해당 조직 디렉터리의 계정만을 위해 구성합니다. 자세한 내용은 Register an application을 참조하십시오. 응용 프로그램 개요 페이지에서 다음 값을 나중에 사용할 수 있도록 기록하십시오.
    • 애플리케이션(클라이언트) ID
    • 디렉터리(테넌트) ID
  • 앱 등록에 클라이언트 비밀을 추가합니다. 프로덕션 앱에서는 클라이언트 비밀을 사용하지 마세요. 대신 인증서 또는 페더레이션된 자격 증명을 사용합니다. 자세한 내용은 애플리케이션에 자격 증명 추가를 참조하세요.

Flask 프로젝트 만들기

  1. flask-web-app 같은 Flask 애플리케이션을 호스트할 폴더를 만듭니다.

  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 라이브러리는 Python용 MSAL(Microsoft 인증 라이브러리)을 종속성으로 자동으로 설치합니다. MSAL Python은 사용자를 인증하고 액세스 토큰을 관리할 수 있는 라이브러리입니다.

필요한 라이브러리를 설치한 후 다음 명령을 실행하여 요구 사항 파일을 업데이트합니다.

pip freeze > requirements.txt

인증을 위해 애플리케이션 구성

Microsoft ID 플랫폼을 사용하여 사용자를 로그인하는 웹 애플리케이션은 구성 파일인 .env를 통해 구성됩니다. Python Flask에서는 다음 값을 지정해야 합니다.

환경 변수 Description
AUTHORITY 애플리케이션이 등록된 클라우드 인스턴스의 URL입니다. 형식: https://{Instance}/{TenantId}. 다음 인스턴스 값 중 하나를 사용합니다.
- https://login.microsoftonline.com/ (Azure 퍼블릭 클라우드)
- https://login.microsoftonline.us/ (Azure 미국 정부)
- https://login.microsoftonline.de/ (Microsoft Entra Germany)
- https://login.partner.microsoftonline.cn/ (Microsoft Entra China, 21Vianet에서 운영)
TENANT_ID 앱이 등록된 테넌트 식별자입니다. 앱 등록에서 테넌트 ID를 선호하거나 다음 중 하나를 사용합니다.
- organizations: 회사 또는 학교 계정에서 사용자 로그인
- common: 회사 또는 학교 계정 또는 Microsoft 개인 계정으로 사용자 로그인
- consumers: Microsoft 개인 계정으로만 사용자 로그인
CLIENT_ID 앱 등록에서 가져온 애플리케이션(클라이언트)의 식별자입니다.
CLIENT_SECRET Microsoft Entra 관리 센터의 자격 증명 추가 에서 얻은 비밀 값입니다.
REDIRECT_URI Microsoft ID 플랫폼이 인증 후 보안 토큰을 보내는 URI입니다.

구성 파일 업데이트

  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>을(를) 디렉터리(테넌트) ID로 교체하세요. (웹앱을 등록한 곳)
    • <Enter_your_client_secret>을(를) 당신이 만든 웹앱에 대한 클라이언트 비밀 값으로 바꾸십시오. 이 자습서에서는 데모를 위해 비밀을 사용합니다. 프로덕션 환경에서는 인증서 또는 페더레이션 ID 자격 증명같은 보다 안전한 방법을 사용합니다.
    • <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 웹앱은 기밀 클라이언트입니다. 기밀 클라이언트가 안전하게 저장할 수 있기 때문에 클라이언트 비밀을 전달합니다. 내부적으로 ID 라이브러리는 MSAL 라이브러리의 ConfidentialClientApplication 클래스를 호출합니다.

    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 앱에 필요한 엔드포인트를 추가합니다. 웹앱은 권한 부여 코드 흐름을 사용하여 사용자를 로그인합니다. ms_identity_python MSAL 래퍼 라이브러리는 MSAL 라이브러리와 상호 작용하는 데 도움이 되므로 로그인을 추가하고 앱에 로그아웃하기 쉽습니다. 인덱스 페이지를 추가하고 login_required 라이브러리에서 제공하는 데코레이터를 사용하여 보호합니다. 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. 단계에 따라 Microsoft 계정으로 로그인합니다. 로그인할 전자 메일 주소와 암호를 입력하라는 요청이 있습니다.

  4. 애플리케이션에 필요한 범위가 있는 경우 동의 화면이 표시됩니다. 애플리케이션은 귀하가 허용한 데이터에 대한 지속적인 액세스와 귀하의 로그인을 위한 권한을 요청합니다. 수락선택합니다. 범위가 정의되어 있지 않으면 이 화면이 표시되지 않습니다.

로그인하거나 등록하면 웹앱으로 다시 리디렉션됩니다. 다음 스크린샷과 비슷한 페이지가 표시됩니다.

인증에 성공한 후 Flask 웹 애플리케이션 샘플 스크린샷

로그아웃 선택하여 앱에서 로그아웃합니다. 로그아웃할 계정을 선택하라는 메시지가 표시됩니다. 로그인하는 데 사용한 계정을 선택합니다.

사용자 지정 URL 도메인 사용(선택 사항)

직원 테넌트는 사용자 지정 URL 도메인을 지원하지 않습니다.