연습 - MSAL을 사용하여 Microsoft Graph API에 대한 액세스 권한 부여

완료됨

이 연습에서는 권한으로 애플리케이션을 구성하고 MSAL을 사용하여 MS Graph(Microsoft Graph) API에서 사용자 프로필 정보에 액세스합니다.

앱 등록에 Microsoft Graph 권한 추가

Microsoft Entra ID로 보호되는 웹 서비스는 해당 서비스에서 노출되는 API 기능 및 데이터에 대한 액세스를 제공하는 권한 집합을 정의합니다. 애플리케이션이 데이터에 액세스하거나 사용자를 대신하여 작업을 수행하려면 이러한 사용 권한을 사용자가 승인하도록 요청해야 합니다. Azure Portal에서 앱 등록에 이러한 API 권한을 할당할 수 있습니다. 애플리케이션에 Microsoft Graph API 권한을 할당하는 단계는 다음과 같습니다.

  1. 앱 등록 화면에서 API 권한을 선택하여 애플리케이션에 필요한 API에 대한 액세스 권한을 추가합니다.

    Azure Portal에서 Microsoft Entra ID에 등록된 앱의 API 권한 창 메뉴를 보여 주는 스크린샷.

    • 권한 추가를 선택합니다.

    • Microsoft API 탭이 선택되어 있는지 확인합니다.

    • 일반적으로 사용되는 Microsoft API 섹션에서 Microsoft Graph를 선택한 다음 위임된 권한을 선택합니다.

    • 위임된 권한 섹션에서 아래로 스크롤하여 목록에서 User.Read를 선택합니다. 이 특정 권한은 https://graph.microsoft.com/v1.0/me 엔드포인트에서 로그인한 사용자의 정보에 액세스하기 위한 것입니다.

    • 권한 추가를 선택합니다.

      Azure Portal에서 Microsoft Entra ID에 등록된 앱의 API 권한 창을 보여 주는 스크린샷.

애플리케이션 실행

이전 연습에서 실행한 애플리케이션에서 Graph API 호출을 시도할 수 있습니다.

  1. 브라우저를 열고 http://localhost:8080/msal4j-servlet-graph/로 이동합니다. 아직 로그인하지 않은 경우 Microsoft Entra ID로 로그인하도록 리디렉션됩니다. 성공적으로 로그인하면 다음 이미지에 표시된 페이지가 표시됩니다.

    샘플 애플리케이션에 성공적으로 로그인한 후 페이지에 표시된 그래프를 호출하는 단추를 보여 주는 스크린샷.

  2. Graph 호출을 선택하여 Microsoft Graph의 /me 엔드포인트를 호출하고 표시된 사용자 세부 정보를 확인합니다.

Microsoft Graph 액세스에 대한 코드 개요

샘플 프로젝트의 msal4j/callgraphwebapp/ 디렉터리에 있는 서블릿 클래스 CallGraphServlet.java에서 Microsoft Graph API에 액세스하는 코드를 찾을 수 있습니다. 이 코드는 로그인한 사용자의 프로필 정보를 검색하기 위해 Microsoft Graph API https://graph.microsoft.com/v1.0/me 엔드포인트에 대한 권한 있는 호출을 만드는 애플리케이션의 /call_graph 엔드포인트를 정의합니다. Graph 액세스 코드에 대한 자세한 내용은 다음과 같습니다.

  1. ./src/main/resources/authentication.properties 파일에서 aad.scopes의 값은 User.Read 범위로 설정됩니다.

    범위는 애플리케이션이 요청하는 액세스 수준을 Microsoft Entra ID에 알려주고 앱 등록의 권한에 매핑합니다. 요청된 범위에 따라 Microsoft Entra ID는 로그인 시 사용자에게 동의 대화를 표시합니다. 사용자가 하나 이상의 범위에 동의하면 인증 응답에 반환된 결과 access_token으로 인코딩됩니다.

  2. 사용자가 /call_graph로 이동하면 애플리케이션은 IGraphServiceClient(Microsoft Graph SDK Java)의 인스턴스를 만들고 로그인한 사용자의 액세스 토큰을 전달합니다. 여기서 Graph 클라이언트는 요청의 권한 부여 헤더에 액세스 토큰을 추가합니다. 그런 다음, 앱은 Graph 클라이언트에 Microsoft Graph의 /me 엔드포인트를 호출하여 현재 로그인한 사용자에 대한 세부 정보를 생성하도록 요청합니다.

    User.Read 범위가 있는 Graph Service에 대한 유효한 액세스 토큰이 이미 있는 경우 애플리케이션 개발자는 /me 엔드포인트에 액세스하기 위해 다음 코드만 작성하면 됩니다.

    //CallGraphServlet.java
    User user = GraphHelper.getGraphClient(contextAdapter).me().buildRequest().get();