적용 대상: 
외부 테넌트(자세한 정보)
이 자습서에서는 Python Flask 웹앱에서 Microsoft Graph API를 호출합니다. 이전 자습서 에서 애플리케이션에 로그인 및 로그아웃 환경을 추가했습니다. 사용자가 로그인하면 앱은 Microsoft Graph API를 호출하는 액세스 토큰을 획득합니다.
이 자습서에서는 다음을 수행합니다.
- 액세스 토큰을 획득하도록 기존 Python Flask 웹앱 업데이트
- 액세스 토큰을 사용하여 Microsoft Graph API를 호출합니다.
필수 조건
자습서의 단계를 완료합니다. Microsoft ID 플랫폼을 사용하여 Python Flask 웹앱에 로그인 추가를 추가합니다.
범위 및 API 엔드포인트 정의
이 예제에서는 Microsoft Graph API를 호출하여 로그인한 사용자의 프로필 정보를 가져옵니다. 앱이 인력 테넌트에 있는 경우 로그인 시 사용자는 앱이 Microsoft Graph API에 액세스하는 데 필요한 범위에 동의합니다. 앱이 외부 테넌트에 있는 경우 테넌트 에서 사용자를 대신하여 관리자 동의를 부여해야 합니다. 그런 다음 앱은 액세스 토큰을 사용하여 API를 호출하고 결과를 표시합니다.
.env 파일에서 호출하는 엔드포인트와 Microsoft Graph API를 호출하는 데 필요한 범위를 추가합니다.
SCOPE=User.Read
ENDPOINT=https://graph.microsoft.com/v1.0/me
app_config.py 파일을 업데이트하여 앱에서 새 구성을 읽습니다.
# other configs go here
SCOPE = os.getenv("SCOPE")
ENDPOINT = os.getenv("ENDPOINT")
보호된 API 호출
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 )다음 코드 조각과 같이 보호된 Microsoft Graph 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 Graph API)에 대한 성공적인 요청은 변수에
api_result저장되고 렌더링을 위해 템플릿에display.html전달된 JSON 응답을 반환합니다.
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>
샘플 웹앱 실행 및 테스트
터미널에서 다음 명령을 실행합니다.
python3 -m flask run --debug --host=localhost --port=3000선택한 포트를 사용할 수 있습니다. 이 포트는 이전에 등록한 리디렉션 URI의 포트와 유사해야 합니다.
브라우저를 열고
http://localhost:3000으로 이동하세요. 로그인 페이지가 표시됩니다.단계에 따라 Microsoft 계정으로 로그인합니다. 로그인할 전자 메일 주소와 암호를 입력하라는 요청이 있습니다.
애플리케이션에 필요한 범위가 있는 경우 동의 화면이 표시됩니다. 애플리케이션은 귀하가 허용한 데이터에 대한 지속적인 액세스와 귀하의 로그인을 위한 권한을 요청합니다. 수락을 선택합니다. 범위가 정의되어 있지 않으면 이 화면이 표시되지 않습니다.
API 호출
홈페이지 에서 API 호출 링크를 선택합니다. 앱은 Microsoft Graph API를 호출하여 로그인한 사용자의 프로필 정보를 가져옵니다. 앱은 API 호출 결과를 표시합니다.
로그아웃 선택하여 앱에서 로그아웃합니다. 로그아웃할 계정을 선택하라는 메시지가 표시됩니다. 로그인하는 데 사용한 계정을 선택합니다.
참조 자료
ms_identity_python MSAL 라이브러리의 세부 정보를 추상화합니다. 자세한 내용은 msAL Python 설명서 참조하세요. 이 참조 자료는 MSAL Python을 사용하여 앱을 초기화하고 토큰을 획득하는 방법을 이해하는 데 도움이 됩니다.