แบบฝึกหัด - ลงชื่อเข้าใช้ผู้ใช้ด้วย MSAL

เสร็จสมบูรณ์เมื่อ

ในแบบฝึกหัดนี้ คุณใช้ไลบรารีการรับรองความถูกต้องของ Microsoft สําหรับ Java (MSAL4J) เพื่อเพิ่มการรับรองความถูกต้องในแอปพลิเคชันเว็บ Java ตัวอย่าง และอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้ด้วยบัญชี Microsoft Entra ของพวกเขา

แอปพลิเคชันตัวอย่างที่คุณใช้ในแบบฝึกหัดนี้คือแอปพลิเคชัน Java servlet ที่อนุญาตให้ผู้ใช้ลงชื่อเข้าใช้ และแสดงข้อมูลชื่อผู้ใช้และข้อมูลโปรไฟล์พื้นฐาน นอกจากนี้ยังช่วยให้คุณสามารถเรียกใช้ API ของ Microsoft Graph เพื่อแสดงข้อมูลผู้ใช้บางอย่างได้

สร้างแอปพลิเคชันเว็บ Java

จากเชลล์หรือบรรทัดคําสั่งของคุณ:

  1. สร้างโฟลเดอร์สําหรับแอปพลิเคชัน

    mkdir ~/javawebapp
    
  2. ลอกแบบแอปพลิเคชันตัวอย่างจากที่เก็บ GitHub ลงในโฟลเดอร์ใหม่

    git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
    
  3. เปลี่ยนลงในโฟลเดอร์ที่มีแอปพลิเคชันตัวอย่างสําหรับแบบฝึกหัดนี้อยู่

    cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
    

กําหนดค่าแอปพลิเคชัน

ในการกําหนดค่ารหัส ให้เปิดโครงการแอปพลิเคชันใน IDE ที่คุณต้องการ เช่น IntelliJ หรือ VS Code

  1. เปิดไฟล์ ./src/main/resources/authentication.properties

  2. ในคุณสมบัติ aad.authority ให้ค้นหาสตริง {enter-your-tenant-id-here} แทนที่ค่าที่มีอยู่ด้วยค่า ID Directory (ผู้เช่า) ดังที่แสดงในรูปต่อไปนี้ - เนื่องจากมีการลงทะเบียนแอปด้วยบัญชี ในไดเรกทอรีขององค์กรนี้เท่านั้น ตัวเลือก

  3. ในคุณสมบัติ aad.clientId ค้นหา {enter-your-client-id-here} สตริงและแทนที่ค่าที่มีอยู่ด้วย ID แอปพลิเคชัน (ไคลเอ็นต์) ค่า - ค่า clientId ของแอปพลิเคชันที่ลงทะเบียนที่คัดลอกมาจากพอร์ทัล Azure

    สกรีนช็อตที่เน้น ID แอปของแอปที่ลงทะเบียนด้วย Microsoft Entra ID บนพอร์ทัล Azure

  4. ในคุณสมบัติ aad.secret ให้ค้นหา {enter-your-client-secret-here} สตริงและแทนที่ค่าที่มีอยู่ด้วยค่า คีย์ ที่คุณบันทึกในระหว่างการสร้างแอปในพอร์ทัล Azure

เรียกใช้แอปพลิเคชัน

  1. ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ Tomcat ของคุณกําลังทํางานและคุณมีสิทธิ์ในการปรับใช้เว็บแอป ตรวจสอบให้แน่ใจว่าที่อยู่โฮสต์เซิร์ฟเวอร์ของคุณ http://localhost:8080

  2. คอมไพล์และจัดแพคเกจโครงการโดยใช้ Maven:

    cd ~/javawebapp/2-Authorization-I/call-graph
    mvn clean package
    
  3. ค้นหาไฟล์ .war ที่เกิดขึ้นที่ ./target/msal4j-servlet-graph.war เมื่อต้องการปรับใช้กับ Tomcat ให้คัดลอกไฟล์ .war นี้ไปยังไดเรกทอรี /webapps/ ในไดเรกทอรีการติดตั้ง Tomcat ของคุณ และเริ่มต้นเซิร์ฟเวอร์ Tomcat

  4. เปิดเบราว์เซอร์ของคุณและนําทางไปยัง http://localhost:8080/msal4j-servlet-graph/ ระบบจะเปลี่ยนเส้นทางคุณให้ลงชื่อเข้าใช้ด้วย Microsoft Entra ID ในการลงชื่อเข้าใช้สําเร็จ คุณควรจะเห็นหน้าดังต่อไปนี้:

    สกรีนช็อตที่แสดงชื่อผู้ใช้ที่แสดงบนหน้าหลังจากลงชื่อเข้าใช้แอปพลิเคชันตัวอย่างเรียบร้อยแล้ว

  5. เลือกปุ่ม รายละเอียดโทเค็น id เพื่อดูการอ้างสิทธิ์ที่ถอดรหัสของโทเค็น ID บางส่วน

ภาพรวมของรหัสการรับรองความถูกต้อง

คุณสามารถค้นหาส่วนใหญ่ของรหัสรับรองตัวตนในแอปพลิเคชันตัวอย่างภายใต้ไดเรกทอรี java/com/microsoft/azuresamples/msal4j/ ของโครงการ ซึ่งประกอบด้วยบริการหลายบริการที่มีจุดสิ้นสุดการรับรองความถูกต้องในแอปพลิเคชันสําหรับการลงชื่อเข้าใช้ การลงชื่อออก และการจัดการการเรียกกลับการเปลี่ยนเส้นทางจาก Microsoft Entra ID บริการเหล่านี้ใช้คลาสตัวช่วยเหลือในไดเรกทอรี java/com/microsoft/azuresamples/msal4j/helpers/ เพื่อเรียกใช้วิธีการรับรองความถูกต้องที่ให้มาโดย MSAL มีตัวกรองบริการที่กําหนดไว้ใน AuthenticationFilter.java ที่เปลี่ยนเส้นทางคําขอที่ไม่ผ่านการรับรองความถูกต้องไปยังเส้นทางที่ได้รับการป้องกันไปยังหน้าข้อผิดพลาด HTTP ที่ไม่ได้รับอนุญาต 401 หน้า

หากต้องการเพิ่มการรับรองความถูกต้องไปยังแอปพลิเคชันของคุณ คุณจะต้องรวมคลาสบริการภายใต้ไดเรกทอรี java/com/microsoft/azuresamples/msal4j/authservlets และไดเรกทอรี java/com/microsoft/azuresamples/msal4j/authwebapp ผู้ช่วยเหลือจะอยู่ในคลาสผู้ช่วยเหลือในไดเรกทอรี java/com/microsoft/azuresamples/msal4j/helpers/ และตัวกรอง servlet การรับรองความถูกต้อง AuthenticationFilter.java ในโครงการของคุณ ต่อไปนี้เป็นรายละเอียดเพิ่มเติมของรหัสการรับรองความถูกต้อง MSAL

  1. MSAL4J พร้อมใช้งานบน Maven คุณจําเป็นต้องเพิ่ม MSAL4J เป็นการขึ้นต่อกันในไฟล์ pom.xml ของโครงการ:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.17.2</version>
    </dependency>
    
  2. ขั้นตอนแรกของกระบวนการลงชื่อเข้าใช้คือการส่งคําขอไปยังจุดสิ้นสุด /authorize ของผู้เช่า Microsoft Entra อินสแตนซ์ MSAL4J ConfidentialClientApplication ถูกใช้ประโยชน์จากการสร้าง URL คําขอการรับรองความถูกต้อง แอปจะเปลี่ยนเส้นทางเบราว์เซอร์ไปยัง URL นี้ ซึ่งเป็นที่ที่ผู้ใช้ลงชื่อเข้าใช้ โค้ดต่อไปนี้เป็นข้อความที่ตัดตอนมาจากการใช้งานวิธีการ redirectToAuthorizationEndpoint ในคลาส AuthHelper

    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: URI เปลี่ยนเส้นทางคือ URI ที่ตัวให้บริการข้อมูลประจําตัวส่งโทเค็นความปลอดภัยกลับไปยัง Microsoft Entra ID เปลี่ยนเส้นทางเบราว์เซอร์พร้อมกับรหัสการรับรองความถูกต้อง - ไปยัง URI นี้หลังจากรวบรวมข้อมูลประจําตัวผู้ใช้ จะต้องตรงกับ URI เปลี่ยนเส้นทางในการลงทะเบียนแอป Microsoft Entra
    • SCOPES: ขอบเขตเป็นสิทธิ์ที่แอปพลิเคชันร้องขอ โดยปกติ ขอบเขตสามขอบเขต openid profile offline_access เพียงพอสําหรับการรับการตอบสนองโทเค็น ID สําหรับผู้ใช้ที่ลงชื่อเข้าใช้ และมีการตั้งค่าตามค่าเริ่มต้นโดย MSAL
  3. ผู้ใช้จะได้รับพร้อมท์ลงชื่อเข้าใช้โดย Microsoft Entra ID หากการพยายามลงชื่อเข้าใช้สําเร็จ เบราว์เซอร์ของผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังจุดสิ้นสุดการเปลี่ยนเส้นทางของแอปของเราด้วยรหัสการให้สิทธิ์ ที่ถูกต้อง ในจุดสิ้นสุด อินสแตนซ์ ConfidentialClientApplication จะแลกเปลี่ยนรหัสการให้สิทธิ์นี้สําหรับโทเค็น ID และโทเค็นการเข้าถึงจาก ID Microsoft Entra โค้ดต่อไปนี้เป็นข้อความที่ตัดตอนมาจากการใช้งานวิธีการ processAADCallback ในคลาส AuthHelper

    // 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 ผ่าน ผลลัพธ์จะถูกใส่ไว้ใน context - อินสแตนซ์ของ IdentityContextData และบันทึกไปยังเซสชัน จากนั้นแอปพลิเคชันสามารถสร้างอินสแตนซ์นี้จากเซสชัน โดยอินสแตนซ์ของ IdentityContextAdapterServlet - เมื่อใดก็ตามที่ต้องการเข้าถึง:

    // 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());