แบบฝึกหัด - ลงชื่อเข้าใช้ผู้ใช้ด้วย MSAL
ในแบบฝึกหัดนี้ คุณใช้ไลบรารีการรับรองความถูกต้องของ Microsoft สําหรับ Java (MSAL4J) เพื่อเพิ่มการรับรองความถูกต้องในแอปพลิเคชันเว็บ Java ตัวอย่าง และอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้ด้วยบัญชี Microsoft Entra ของพวกเขา
แอปพลิเคชันตัวอย่างที่คุณใช้ในแบบฝึกหัดนี้คือแอปพลิเคชัน Java servlet ที่อนุญาตให้ผู้ใช้ลงชื่อเข้าใช้ และแสดงข้อมูลชื่อผู้ใช้และข้อมูลโปรไฟล์พื้นฐาน นอกจากนี้ยังช่วยให้คุณสามารถเรียกใช้ API ของ Microsoft Graph เพื่อแสดงข้อมูลผู้ใช้บางอย่างได้
สร้างแอปพลิเคชันเว็บ Java
จากเชลล์หรือบรรทัดคําสั่งของคุณ:
สร้างโฟลเดอร์สําหรับแอปพลิเคชัน
mkdir ~/javawebappลอกแบบแอปพลิเคชันตัวอย่างจากที่เก็บ GitHub ลงในโฟลเดอร์ใหม่
git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebappเปลี่ยนลงในโฟลเดอร์ที่มีแอปพลิเคชันตัวอย่างสําหรับแบบฝึกหัดนี้อยู่
cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
กําหนดค่าแอปพลิเคชัน
ในการกําหนดค่ารหัส ให้เปิดโครงการแอปพลิเคชันใน IDE ที่คุณต้องการ เช่น IntelliJ หรือ VS Code
เปิดไฟล์ ./src/main/resources/authentication.properties
ในคุณสมบัติ
aad.authorityให้ค้นหาสตริง{enter-your-tenant-id-here}แทนที่ค่าที่มีอยู่ด้วยค่า ID Directory (ผู้เช่า) ดังที่แสดงในรูปต่อไปนี้ - เนื่องจากมีการลงทะเบียนแอปด้วยบัญชี ในไดเรกทอรีขององค์กรนี้เท่านั้น ตัวเลือกในคุณสมบัติ
aad.clientIdค้นหา{enter-your-client-id-here}สตริงและแทนที่ค่าที่มีอยู่ด้วย ID แอปพลิเคชัน (ไคลเอ็นต์) ค่า - ค่าclientIdของแอปพลิเคชันที่ลงทะเบียนที่คัดลอกมาจากพอร์ทัล Azure
ในคุณสมบัติ
aad.secretให้ค้นหา{enter-your-client-secret-here}สตริงและแทนที่ค่าที่มีอยู่ด้วยค่า คีย์ ที่คุณบันทึกในระหว่างการสร้างแอปในพอร์ทัล Azure
เรียกใช้แอปพลิเคชัน
ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ Tomcat ของคุณกําลังทํางานและคุณมีสิทธิ์ในการปรับใช้เว็บแอป ตรวจสอบให้แน่ใจว่าที่อยู่โฮสต์เซิร์ฟเวอร์ของคุณ
http://localhost:8080คอมไพล์และจัดแพคเกจโครงการโดยใช้ Maven:
cd ~/javawebapp/2-Authorization-I/call-graph mvn clean packageค้นหาไฟล์ .war ที่เกิดขึ้นที่ ./target/msal4j-servlet-graph.war เมื่อต้องการปรับใช้กับ Tomcat ให้คัดลอกไฟล์ .war นี้ไปยังไดเรกทอรี /webapps/ ในไดเรกทอรีการติดตั้ง Tomcat ของคุณ และเริ่มต้นเซิร์ฟเวอร์ Tomcat
เปิดเบราว์เซอร์ของคุณและนําทางไปยัง
http://localhost:8080/msal4j-servlet-graph/ระบบจะเปลี่ยนเส้นทางคุณให้ลงชื่อเข้าใช้ด้วย Microsoft Entra ID ในการลงชื่อเข้าใช้สําเร็จ คุณควรจะเห็นหน้าดังต่อไปนี้:
เลือกปุ่ม รายละเอียดโทเค็น 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
MSAL4J พร้อมใช้งานบน Maven คุณจําเป็นต้องเพิ่ม MSAL4J เป็นการขึ้นต่อกันในไฟล์ pom.xml ของโครงการ:
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>msal4j</artifactId> <version>1.17.2</version> </dependency>ขั้นตอนแรกของกระบวนการลงชื่อเข้าใช้คือการส่งคําขอไปยังจุดสิ้นสุด
/authorizeของผู้เช่า Microsoft Entra อินสแตนซ์ MSAL4JConfidentialClientApplicationถูกใช้ประโยชน์จากการสร้าง URL คําขอการรับรองความถูกต้อง แอปจะเปลี่ยนเส้นทางเบราว์เซอร์ไปยัง URL นี้ ซึ่งเป็นที่ที่ผู้ใช้ลงชื่อเข้าใช้ โค้ดต่อไปนี้เป็นข้อความที่ตัดตอนมาจากการใช้งานวิธีการredirectToAuthorizationEndpointในคลาสAuthHelperfinal 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
-
ผู้ใช้จะได้รับพร้อมท์ลงชื่อเข้าใช้โดย 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: ขอบเขตที่ใช้ในขั้นตอนก่อนหน้าต้องถูกส่งผ่านอีกครั้ง
-
ถ้า
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());