다음을 통해 공유


Java WebSphere 앱이 사용자를 로그인하고 Microsoft Graph에 액세스할 수 있도록 설정

이 문서에서는 사용자를 로그인하고 Microsoft Graph를 호출하기 위한 액세스 토큰을 가져오는 Java WebSphere 앱을 보여 줍니다. JavaMSAL(Microsoft 인증 라이브러리)을 사용합니다.

다음 다이어그램은 앱의 토폴로지입니다.

앱의 토폴로지 다이어그램

클라이언트 앱은 MSAL for Java(MSAL for Java)를 사용하여 사용자를 로그인하고 Microsoft Entra ID에서 Microsoft Graph에 대한 액세스 토큰을 가져옵니다. 액세스 토큰은 사용자가 범위에 정의된 대로 Microsoft Graph API 엔드포인트에 액세스할 권한이 있음을 증명합니다.

필수 조건

  • Java 8 이상
  • Maven 3
  • Microsoft Entra ID 테넌트입니다. 자세한 내용은 Microsoft Entra ID 테넌트를 가져오는 방법을 참조 하세요.
  • 조직 디렉터리의 계정(즉, 단일 테넌트 모드)만 사용하려는 경우 사용자 고유의 Microsoft Entra ID 테넌트에 있는 사용자 계정입니다. 테넌트에서 사용자 계정을 아직 만들지 않은 경우 계속하기 전에 만들어야 합니다. 자세한 내용은 사용자를 만들고 초대하고 삭제하는 방법을 참조 하세요.
  • 조직의 모든 디렉터리(다중 테넌트 모드)의 계정으로 작업하려는 경우 조직의 Microsoft Entra ID 테넌트의 사용자 계정입니다. 이 샘플은 개인 Microsoft 계정으로 작동하도록 수정해야 합니다. 테넌트에서 사용자 계정을 아직 만들지 않은 경우 계속하기 전에 만들어야 합니다. 자세한 내용은 사용자를 만들고 초대하고 삭제하는 방법을 참조 하세요.
  • 개인 Microsoft 계정(예: Xbox, Hotmail, Live 등)을 개인 Microsoft 계정으로 작업하려는 경우

권장 사항

샘플 설정

다음 섹션에서는 샘플 애플리케이션을 설정하는 방법을 보여줍니다.

샘플 리포지토리 복제 또는 다운로드

샘플을 복제하려면 Bash 창을 열고 다음 명령을 사용합니다.

git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git
cd 2-Authorization-I/call-graph

또는 ms-identity-java-servlet-webapp-authentication 리포지토리로 이동한 다음, .zip 파일로 다운로드하여 하드 드라이브에 추출합니다.

Important

Windows에서 파일 경로 길이 제한을 방지하려면 리포지토리를 하드 드라이브 루트 근처의 디렉터리에 복제하거나 추출합니다.

Microsoft Entra ID 테넌트에 샘플 애플리케이션 등록

이 샘플에는 하나의 프로젝트가 있습니다. Azure Portal에서 앱을 등록하려면 수동 구성 단계를 따르거나 PowerShell 스크립트를 사용할 수 있습니다. 스크립트는 다음 작업을 수행합니다.

  • Microsoft Entra ID 애플리케이션 및 관련 개체(예: 암호, 권한 및 종속성)를 만듭니다.
  • 프로젝트 구성 파일을 수정합니다.
  • 기본적으로 조직 디렉터리의 계정에서만 작동하는 애플리케이션을 설정합니다.

다음 단계를 사용하여 PowerShell 스크립트를 실행합니다.

  1. Windows에서 PowerShell을 열고 복제된 디렉터리의 루트로 이동합니다.

  2. 다음 명령을 사용하여 PowerShell에 대한 실행 정책을 설정합니다.

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force
    
  3. 다음 명령을 사용하여 구성 스크립트를 실행합니다.

    cd .\AppCreationScripts\
    .\Configure.ps1
    

    참고 항목

    스크립트를 실행하는 다른 방법은 앱 만들기 스크립트에 설명되어 있습니다. 또한 스크립트는 CI/CD 시나리오에 도움이 될 수 있는 자동화된 애플리케이션 등록, 구성 및 제거에 대한 가이드를 제공합니다.

앱 등록을 사용하도록 앱 구성(java-servlet-webapp-call-graph)

다음 단계를 사용하여 앱을 구성합니다.

참고 항목

다음 단계에서 ClientID 는 같거나 AppId같습니다Application ID.

  1. IDE에서 프로젝트를 엽니다.

  2. ./src/기본/resources/authentication.properties 파일을 엽니다.

  3. 문자열 {enter-your-tenant-id-here}를 찾습니다. 기존 값을 다음 값 중 하나로 바꿉다.

    • 이 조직 디렉터리 전용 옵션의 계정에 앱을 등록한 경우 Microsoft Entra ID 테넌트 ID입니다.
    • 조직 디렉터리 옵션의 계정에 앱을 등록한 경우의 단어 organizations 입니다.
    • 조직 디렉터리 및 개인 Microsoft 계정 옵션의 계정에 앱을 등록한 경우의 단어 common 입니다.
    • 개인 Microsoft 계정 옵션으로 앱을 등록한 경우의 단어 consumers 입니다.
  4. 문자열 {enter-your-client-id-here} 을 찾아 기존 값을 애플리케이션 ID 또는 clientId Azure Portal에서 복사한 애플리케이션으로 java-servlet-webapp-call-graph 바꿉니다.

  5. 문자열 {enter-your-client-secret-here} 을 찾고 Azure Portal에서 앱을 만드는 java-servlet-webapp-call-graph 동안 저장한 값으로 기존 값을 바꿉니다.

샘플 빌드

Maven을 사용하여 샘플을 빌드하려면 샘플에 대한 pom.xml 파일이 포함된 디렉터리로 이동한 다음 다음 명령을 실행합니다.

mvn clean package

이 명령은 다양한 애플리케이션 서버에서 실행할 수 있는 .war 파일을 생성합니다.

샘플 실행

이러한 지침에서는 WebSphere를 설치하고 서버를 설정했다고 가정합니다. 기본 서버 설정을 위해 Azure Virtual MachinesWebSphere 애플리케이션 서버(기존) 클러스터 배포에서 지침을 사용할 수 있습니다.

WebSphere에 배포하기 전에 다음 단계를 사용하여 샘플 자체에서 몇 가지 구성을 변경한 다음 패키지를 빌드하거나 다시 빌드합니다.

  1. 다음 예제와 같이 앱의 authentication.properties 파일로 이동하고 사용하려는 서버 URL 및 포트 번호로 값을 app.homePage 변경합니다.

    # app.homePage is by default set to dev server address and app context path on the server
    # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net
    app.homePage=https://<server-url>:<port-number>/msal4j-servlet-auth/
    
  2. 이 파일을 저장한 후 다음 명령을 사용하여 앱을 다시 빌드합니다.

    mvn clean package
    
  3. 코드 빌드가 완료되면 .war 파일을 대상 서버의 파일 시스템에 복사합니다.

또한 Azure Portal에서 인증 탭의 리디렉션 URI으로 설정하는 Azure 앱 등록을 동일하게 변경해야 합니다.

  1. 개발자용 Microsoft ID 플랫폼의 앱 등록 페이지로 이동합니다.

  2. 검색 상자를 사용하여 앱 등록을 검색합니다(예: .) java-servlet-webapp-authentication.

  3. 이름을 선택하여 앱 등록을 엽니다.

  4. 메뉴에서 인증을 선택합니다.

  5. - 리디렉션 URI 섹션에서 URI 추가를 선택합니다.

  6. 앱의 URI를 입력하고 /auth/redirect추가합니다(예https://<server-url>:<port-number>/auth/redirect: .).

  7. 저장을 선택합니다.

다음 단계를 사용하여 WebSphere의 통합 솔루션 콘솔을 사용하여 샘플을 배포합니다.

  1. 애플리케이션 탭에서 새 애플리케이션, 새 엔터프라이즈 애플리케이션을 선택합니다.

  2. 빌드한 .war 파일을 선택한 다음 웹 모듈 설치 단계의 맵 컨텍스트 루트에 도착할 때까지 다음 선택합니다. 다른 기본 설정은 괜찮을 것입니다.

  3. 컨텍스트 루트의 경우 샘플 구성/Azure 앱 등록에서 설정한 '리디렉션 URI'의 포트 번호 뒤와 동일한 값으로 설정합니다. 즉, 리디렉션 URI인 http://<server-url>:9080/msal4j-servlet-auth/경우 컨텍스트 루트가 되어야 msal4j-servlet-auth합니다.

  4. 마침을 선택합니다.

  5. 애플리케이션 설치가 완료되면 애플리케이션 탭의 WebSphere 엔터프라이즈 애플리케이션 섹션으로 이동합니다.

  6. 애플리케이션 목록에서 설치한 .war 파일을 선택한 다음 배포 시작을 선택합니다.

  7. 배포가 완료되면 애플리케이션으로 http://<server-url>:9080/{whatever you set as the context root} 이동하면 애플리케이션을 볼 수 있습니다.

샘플 탐색

다음 단계를 사용하여 샘플을 탐색합니다.

  1. 로그인 또는 로그아웃된 상태 화면 중앙에 표시됩니다.
  2. 모서리에서 상황에 맞는 단추를 선택합니다. 이 단추는 앱을 처음 실행할 때 로그인을 읽습니다.
  3. 다음 페이지에서 지침을 따르고 Microsoft Entra ID 테넌트에 있는 계정으로 로그인합니다.
  4. 동의 화면에서 요청되는 범위를 확인합니다.
  5. 이제 상황에 맞는 단추에 로그아웃이 표시되고 사용자 이름이 표시됩니다.
  6. ID 토큰 세부 정보를 선택하여 ID 토큰의 디코딩된 클레임 중 일부를 확인합니다.
  7. Graph 호출을 선택하여 Microsoft Graph의 /me 엔드포인트를 호출하고 가져온 사용자 세부 정보를 확인합니다.
  8. 모서리의 단추를 사용하여 로그아웃합니다.

코드 정보

이 샘플에서는 MSAL for Java(MSAL4J)를 사용하여 사용자를 로그인하고 Microsoft Graph API용 토큰을 가져옵니다. Java용 Microsoft Graph SDK를 사용하여 Graph에서 데이터를 가져옵니다. Maven을 사용하여 프로젝트에 이러한 라이브러리를 추가해야 합니다.

이 샘플의 동작을 복제본(replica) 경우 src/기본/java/com/microsoft/azuresamples/msal4j 폴더에 있는 pom.xml 파일 및 도우미authservlets 폴더의 내용을 복사할 수 있습니다. authentication.properties 파일도 필요합니다. 이러한 클래스 및 파일에는 다양한 애플리케이션에서 사용할 수 있는 제네릭 코드가 포함되어 있습니다. 샘플의 나머지 부분도 복사할 수 있지만 다른 클래스와 파일은 이 샘플의 목표를 해결하기 위해 특별히 빌드됩니다.

콘텐츠

다음 표에서는 샘플 프로젝트 폴더의 내용을 보여 줍니다.

파일/폴더 설명
AppCreationScripts/ Microsoft Entra ID 앱 등록을 자동으로 구성하는 스크립트입니다.
src/기본/java/com/microsoft/azuresamples/msal4j/callgraphwebapp/ 이 디렉터리에는 앱의 백 엔드 비즈니스 논리를 정의하는 클래스가 포함되어 있습니다.
src/기본/java/com/microsoft/azuresamples/msal4j/authservlets/ 이 디렉터리에는 로그인 및 로그아웃 엔드포인트에 사용되는 클래스가 포함되어 있습니다.
____Servlet.java 사용 가능한 모든 엔드포인트는 ____Servlet.java 끝나는 .java 클래스에 정의됩니다.
src/기본/java/com/microsoft/azuresamples/msal4j/helpers/ 인증을 위한 도우미 클래스입니다.
AuthenticationFilter.java 인증되지 않은 요청을 보호된 엔드포인트로 401 페이지로 리디렉션합니다.
src/기본/resources/authentication.properties Microsoft Entra ID 및 프로그램 구성.
src/기본/webapp/ 이 디렉터리에는 UI - JSP 템플릿이 포함되어 있습니다.
CHANGELOG.md 샘플의 변경 내용 목록입니다.
CONTRIBUTING.md 샘플에 기여하기 위한 지침입니다.
라이센스 샘플에 대한 라이선스입니다.

ConfidentialClientApplication

ConfidentialClientApplication 인스턴스는 다음 예제와 같이 AuthHelper.java 파일에 만들어집니다. 이 개체는 Microsoft Entra ID 권한 부여 URL을 만드는 데 도움이 되며 액세스 토큰에 대한 인증 토큰을 교환하는 데도 도움이 됩니다.

// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                     .builder(CLIENT_ID, secret)
                     .authority(AUTHORITY)
                     .build();

인스턴스화에는 다음 매개 변수가 사용됩니다.

  • 앱의 클라이언트 ID입니다.
  • 기밀 클라이언트 애플리케이션에 대한 요구 사항인 클라이언트 암호입니다.
  • Microsoft Entra 테넌트 ID를 포함하는 Microsoft Entra ID 기관입니다.

이 샘플에서 이러한 값은 Config.java 파일의 속성 판독기를 사용하여 authentication.properties 파일에서 습니다.

단계별 안내

다음 단계에서는 앱의 기능에 대한 연습을 제공합니다.

  1. 로그인 프로세스의 첫 번째 단계는 Microsoft Entra ID 테넌트에 대한 엔드포인트에 요청을 /authorize 보내는 것입니다. MSAL4J ConfidentialClientApplication 인스턴스는 권한 부여 요청 URL을 생성하는 데 사용됩니다. 앱은 사용자가 로그인하는 이 URL로 브라우저를 리디렉션합니다.

    final ConfidentialClientApplication client = getConfidentialClientInstance();
    AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))
            .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();
    contextAdapter.redirectUser(authorizeUrl);
    

    다음 목록에서는 이 코드의 기능을 설명합니다.

    • AuthorizationRequestUrlParameters: AuthorizationRequestUrl을 빌드하기 위해 설정해야 하는 매개 변수입니다.
    • REDIRECT_URI: 여기서 Microsoft Entra ID는 사용자 자격 증명을 수집한 후 인증 코드와 함께 브라우저를 리디렉션합니다. Azure Portal의 Microsoft Entra ID 앱 등록에서 리디렉션 URI와 일치해야 합니다.
    • SCOPES: 범위는 애플리케이션에서 요청한 권한입니다.
      • 일반적으로 세 가지 범위는 openid profile offline_access ID 토큰 응답을 수신하는 데 충분합니다.
      • 앱에서 요청한 전체 범위 목록은 authentication.properties 파일에서 찾을 수 있습니다. User.Read 등과 같은 범위를 더 추가할 수 있습니다.
  2. 사용자에게 Microsoft Entra ID의 로그인 프롬프트가 표시됩니다. 로그인 시도가 성공하면 사용자의 브라우저가 앱의 리디렉션 엔드포인트로 리디렉션됩니다. 이 엔드포인트에 대한 유효한 요청에는 권한 부여 코드포함되어 있습니다.

  3. 그런 다음, 인스턴스는 ConfidentialClientApplication Microsoft Entra ID에서 ID 토큰 및 액세스 토큰에 대해 이 권한 부여 코드를 교환합니다.

    // First, validate the state, then parse any error codes in response, then extract the authCode. Then:
    // build the auth code params:
    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
            .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();
    
    // Get a client instance and leverage it to acquire the token:
    final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
    final IAuthenticationResult result = client.acquireToken(authParams).get();
    

    다음 목록에서는 이 코드의 기능을 설명합니다.

    • AuthorizationCodeParameters: ID 및/또는 액세스 토큰에 대한 권한 부여 코드를 교환하기 위해 설정해야 하는 매개 변수입니다.
    • authCode: 리디렉션 엔드포인트에서 받은 권한 부여 코드입니다.
    • REDIRECT_URI: 이전 단계에서 사용된 리디렉션 URI를 다시 전달해야 합니다.
    • SCOPES: 이전 단계에서 사용된 범위를 다시 전달해야 합니다.
  4. acquireToken이 성공하면 토큰 클레임이 추출됩니다. nonce 검사 통과하면 결과가 인스턴스 IdentityContextData 에 배치 context 되고 세션에 저장됩니다. 그런 다음, 애플리케이션은 다음 코드와 같이 액세스가 필요할 때마다 인스턴스 IdentityContextAdapterServlet 를 통해 세션에서 인스턴스화 IdentityContextData 할 수 있습니다.

    // parse IdToken claims from the IAuthenticationResult:
    // (the next step - validateNonce - requires parsed claims)
    context.setIdTokenClaims(result.idToken());
    
    // if nonce is invalid, stop immediately! this could be a token replay!
    // if validation fails, throws exception and cancels auth:
    validateNonce(context);
    
    // set user to authenticated:
    context.setAuthResult(result, client.tokenCache().serialize());
    

경로 보호

샘플 앱이 경로에 대한 액세스를 필터링하는 방법에 대한 자세한 내용은 AuthenticationFilter.java 참조하세요. authentication.properties 파일 app.protect.authenticated 에서 속성은 다음 예제와 같이 인증된 사용자만 액세스할 수 있는 쉼표로 구분된 경로를 포함합니다.

# for example, /token_details requires any user to be signed in and does not require special roles or groups claim(s)
app.protect.authenticated=/token_details, /call_graph

호출 그래프

사용자가 탐색할 /call_graph때 애플리케이션은 Java Graph SDK에서 로그인한 사용자의 액세스 토큰을 따라 전달되는 인스턴스 IGraphServiceClient 를 만듭니다. Graph 클라이언트는 액세스 토큰을 해당 요청의 헤더에 Authorization 배치합니다. 그런 다음 앱은 Graph 클라이언트에 엔드포인트를 호출 /me 하여 현재 로그인한 사용자에 대한 세부 정보를 생성하도록 요청합니다.

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

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

범위

범위는 Microsoft Entra ID에 애플리케이션이 요청하는 액세스 수준을 알려줍니다.

요청된 범위에 따라 Microsoft Entra ID는 로그인 시 사용자에게 동의 대화 상자를 제공합니다. 사용자가 하나 이상의 범위에 동의하고 토큰을 가져오는 경우 범위 동의가 결과 access_token로 인코딩됩니다.

애플리케이션에서 요청한 범위는 authentication.properties를 참조하세요. 기본적으로 애플리케이션은 범위 값을 .로 User.Read설정합니다. 이 특정 Microsoft Graph API 범위는 현재 로그인한 사용자의 정보에 액세스하기 위한 것입니다. 이 정보에 액세스하기 위한 그래프 엔드포인트는 https://graph.microsoft.com/v1.0/me입니다. 이 엔드포인트에 대한 유효한 요청은 헤더의 access_token 범위를 User.ReadAuthorization 포함하는 것을 포함해야 합니다.

자세한 정보

다음 단계

Azure Virtual Machines의 기존 WebSphere에 Java WebSphere 앱 배포