Menambahkan rincian masuk dengan Azure Active Directory B2C ke aplikasi web Spring
Artikel ini memperlihatkan kepada Anda cara membuat aplikasi Java dengan kemampuan masuk dengan menggunakan Spring Initializr dengan Spring Boot Starter untuk ID Microsoft Entra.
Dalam tutorial ini, Anda akan mempelajari cara:
- Membuat aplikasi Java menggunakan Spring Initializr
- Mengonfigurasi Azure Active Directory B2C
- Mengamankan aplikasi dengan kelas Spring Boot dan anotasi
- Membangun dan menguji aplikasi Java Anda
MICROSOFT Entra ID adalah solusi identitas perusahaan skala cloud Microsoft. Azure Active Directory B2C melengjari kumpulan fitur ID Microsoft Entra, yang memungkinkan Anda mengelola akses pelanggan, konsumen, dan warga negara ke aplikasi business-to-consumer (B2C) Anda.
Prasyarat
- Langganan Azure. Jika Anda belum memilikinya, buat akun gratis sebelum memulai.
- Kit Pengembangan Java (JDK) yang didukung. Untuk informasi selengkapnya tentang JDK yang tersedia untuk digunakan saat mengembangkan Azure, lihat dukungan Java pada Azure dan Azure Stack.
- Apache Maven, versi 3.0 atau lebih tinggi.
Penting
Spring Boot versi 2.5 atau yang lebih tinggi diperlukan untuk menyelesaikan langkah-langkah dalam artikel ini.
Membuat aplikasi menggunakan Spring Initializr
Telusuri https://start.spring.io/.
Isi nilai-nilai sesuai dengan panduan ini. Label dan tata letak mungkin berbeda dari gambar yang ditunjukkan di sini.
- Di bawah Project, pilih Maven Project.
- Di bawah Bahasa, pilih Java.
- Di bawah Spring Boot, pilih 2.7.11.
- Di bawah Grup, Artefak, dan Nama masukkan nilai yang sama, menggunakan string deskriptif pendek. UI dapat secara otomatis mengisi beberapa bidang ini saat Anda mengetik.
- Di panel Dependensi, pilih Tambahkan Dependensi. Gunakan UI untuk menambahkan dependensi di Spring Web dan Spring Security.
Catatan
Spring Security 5.5.1, 5.4.7, 5.3.10 dan 5.2.11 telah dirilis untuk mengatasi laporan CVE berikut CVE-2021-22119: Serangan Penolakan Serangan Layanan dengan spring-security-oauth2-client. Jika Anda menggunakan versi yang lebih lama, silakan tingkatkan.
Pilih Buat Proyek, lalu unduh proyek ke jalur di komputer lokal Anda. Pindahkan file yang diunduh ke direktori yang dinamai sesuai proyek Anda dan buka ritsleting file. Tata letak file akan terlihat seperti berikut, dengan nilai yang Anda masukkan untuk Grup sebagai pengganti
yourProject
.. ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main │ ├── java │ │ └── yourProject │ │ └── yourProject │ │ └── YourProjectApplication.java │ └── resources │ ├── application.properties │ ├── static │ └── templates └── test └── java └── yourProject └── yourProject └── YourProjectApplicationTests.java
Membuat dan menginisialisasi instans Microsoft Entra
Membuat instans Active Directory
Masuk ke https://portal.azure.com.
Pilih Buat sumber daya. Cari Azure Active Directory B2C.
Pilih Buat.
Pilih Buat Penyewa Azure AD B2C baru.
Untuk Nama organisasi dan nama domain Awal, berikan nilai yang sesuai, lalu pilih Buat.
Saat pembuatan Direktori Aktif selesai, pilih akun Anda di sudut kanan atas, pilih Alihkan direktori, lalu pilih direktori yang dibuat. Anda akan diarahkan ke beranda penyewa baru. Cari
b2c
dan pilih Azure AD B2C.
Menambahkan pendaftaran aplikasi untuk aplikasi Spring Boot Anda
Di panel Kelola, pilih Pendaftaran aplikasi, lalu pilih Pendaftaran baru.
Di bidang Nama, masukkan nama aplikasi Anda, lalu pilih Daftar.
Kembali ke panel Kelola, pilih Pendaftaran aplikasi, lalu pilih nama aplikasi yang Anda buat.
Pilih Autentikasi, lalu Tambahkan platform lalu Web. Atur URI Pengalihan ke
http://localhost:8080/login/oauth2/code/
, lalu pilih Konfigurasikan.
Menambahkan rahasia aplikasi untuk aplikasi Anda
Pilih Sertifikat & rahasia, lalu Rahasia klien baru. Masukkan deskripsi rahasia Anda lalu pilih Tambahkan. Setelah Anda membuat rahasia, pilih ikon salin di samping nilai rahasia untuk menyalin nilai untuk digunakan nanti di artikel ini.
Catatan
Jika Anda meninggalkan bagian Sertifikat & rahasia dan kembali, Anda tidak akan dapat melihat nilai rahasia. Dalam hal ini, Anda harus membuat rahasia lain dan menyalinnya untuk penggunaan di masa mendatang. Kadang-kadang, nilai rahasia yang dihasilkan mungkin berisi karakter yang bermasalah untuk dimasukkan dalam file application.yml, seperti backslash atau backtick. Dalam hal ini, buang rahasia itu dan hasilkan yang lain.
Menambahkan alur pengguna
Navigasikan ke halaman utama penyewa Anda. Di bagian Kebijakan di panel kiri, pilih Alur pengguna, lalu pilih Alur pengguna baru.
Anda sekarang akan meninggalkan tutorial ini, menjalankan tutorial lain, dan kembali ke tutorial ini setelah Selesai. Berikut adalah beberapa hal yang perlu diingat ketika Anda pergi ke tutorial lainnya.
- Mulailah dengan langkah yang meminta Anda untuk memilih Alur Pengguna Baru.
- Ketika tutorial ini mengacu pada
webapp1
, gunakan nilai yang Anda masukkan untuk Grup sebagai gantinya. - Saat Anda memilih klaim untuk dikembalikan dari alur, pastikan Nama Tampilan dipilih. Tanpa klaim ini, aplikasi yang dibangun dalam tutorial ini tidak akan berfungsi.
- Saat Anda diminta untuk menjalankan alur pengguna, URL pengalihan yang Anda tentukan sebelumnya belum aktif. Anda masih dapat menjalankan alur, tetapi pengalihan tidak akan berhasil diselesaikan. Sesuai harapan.
- Saat Anda mencapai "Langkah berikutnya", kembali ke tutorial ini.
Ikuti semua langkah dalam Tutorial: Membuat alur pengguna di Azure Active Directory B2C untuk membuat alur pengguna untuk "mendaftar dan masuk", "pengeditan profil" dan "reset kata sandi".
Azure AD B2C mendukung akun lokal serta penyedia identitas sosial. Untuk contoh membuat penyedia identitas GitHub, lihat Menyiapkan pendaftaran dan masuk dengan akun GitHub menggunakan Azure Active Directory B2C.
Mengonfigurasi dan mengompilasi aplikasi Anda
Sekarang setelah Anda membuat instans Azure AD B2C dan beberapa alur pengguna, Anda akan menghubungkan aplikasi Spring Anda ke instans Azure AD B2C.
Dari baris perintah, cd ke direktori tempat Anda mengekstrak file .zip yang Anda unduh dari Spring Initializr.
Navigasikan ke folder induk untuk proyek Anda, dan buka file proyek Maven pom.xml di editor teks.
Tambahkan dependensi untuk keamanan Spring OAuth2 ke pom.xml:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId> <version>See Below</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>See Below</version> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> <version>See Below</version> </dependency>
Untuk
spring-cloud-azure-starter-active-directory-b2c
, gunakan versi terbaru yang tersedia. Anda mungkin dapat menggunakan mvnrepository.com untuk mencari ini.Untuk
spring-boot-starter-thymeleaf
, gunakan versi yang sesuai dengan versi Spring Boot yang Anda pilih di atas, misalnya2.3.4.RELEASE
.Untuk
thymeleaf-extras-springsecurity5
, gunakan versi terbaru yang tersedia. Anda mungkin dapat menggunakan mvnrepository.com untuk mencari ini. Pada tulisan ini, versi terbaru adalah3.0.4.RELEASE
.Simpan dan tutup file pom.xml.
- Verifikasi bahwa dependensi Anda benar dengan menjalankan
mvn -DskipTests clean install
. Jika Anda tidak melihatBUILD SUCCESS
, pecahkan masalah dan selesaikan masalah sebelum melanjutkan.
- Verifikasi bahwa dependensi Anda benar dengan menjalankan
Navigasikan ke folder src/main/resources di proyek Anda dan buat file application.yml di editor teks.
Tentukan pengaturan untuk pendaftaran aplikasi Anda menggunakan nilai yang Anda buat sebelumnya; misalnya:
spring: cloud: azure: active-directory: b2c: enabled: true base-uri: https://<your-tenant-initial-domain-name>.b2clogin.com/<your-tenant-initial-domain-name>.onmicrosoft.com/ credential: client-id: <your-application-ID> client-secret: '<secret-value>' login-flow: sign-up-or-sign-in logout-success-url: <your-logout-success-URL> user-flows: sign-up-or-sign-in: <your-sign-up-or-sign-in-user-flow-name> profile-edit: <your-profile-edit-user-flow-name> password-reset: <your-password-reset-user-flow-name> user-name-attribute-name: <your-user-name-attribute-name>
Perhatikan bahwa nilai
client-secret
terlampir dalam tanda kutip tunggal. Hal ini diperlukan karena nilai<secret-value>
hampir pasti akan berisi beberapa karakter yang membutuhkan berada di dalam kutipan tunggal ketika hadir di YAML.Catatan
Pada tulisan ini, daftar lengkap nilai Active Directory B2C Spring Integration yang tersedia untuk digunakan di application.yml adalah sebagai berikut:
spring: cloud: azure: active-directory: b2c: enabled: true base-uri: credential: client-id: client-secret: login-flow: logout-success-url: user-flows: sign-up-or-sign-in: profile-edit: # optional password-reset: # optional user-name-attribute-name:
File application.yml tersedia dalam sampel spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application di GitHub.
Simpan dan tutup file application.yml.
Buat folder bernama controller di src/main/java/<yourGroupId>/<yourGroupId>, mengganti
<yourGroupId>
dengan nilai yang Anda masukkan unuk Grup.Buat file Java baru bernama WebController.java di folder pengontrol dan buka di editor teks.
Masukkan kode berikut, ubah
yourGroupId
dengan tepat, lalu simpan dan tutup file:package yourGroupId.yourGroupId.controller; import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class WebController { private void initializeModel(Model model, OAuth2AuthenticationToken token) { if (token != null) { final OAuth2User user = token.getPrincipal(); model.addAttribute("grant_type", user.getAuthorities()); model.addAllAttributes(user.getAttributes()); } } @GetMapping(value = "/") public String index(Model model, OAuth2AuthenticationToken token) { initializeModel(model, token); return "home"; } @GetMapping(value = "/greeting") public String greeting(Model model, OAuth2AuthenticationToken token) { initializeModel(model, token); return "greeting"; } @GetMapping(value = "/home") public String home(Model model, OAuth2AuthenticationToken token) { initializeModel(model, token); return "home"; } }
Karena setiap metode dalam panggilan pengontrol
initializeModel()
, dan metode itu memanggilmodel.addAllAttributes(user.getAttributes());
, setiap halaman HTML di src/main/resources/templates dapat mengakses salah satu atribut tersebut, seperti${name}
,${grant_type}
, atau${auth_time}
. Nilai yang dikembalikan dariuser.getAttributes()
sebenarnya adalah klaimid_token
untuk autentikasi. Daftar lengkap klaim yang tersedia tercantum dalam token ID platform identitas Microsoft.Buat folder bernama keamanan di src/main/java/<yourGroupId>/<yourGroupId>, mengganti
yourGroupId
dengan nilai yang Anda masukkan untuk Group.Buat file Java baru bernama WebSecurityConfiguration.java di folder keamanan dan buka di editor teks.
Masukkan kode berikut, ubah
yourGroupId
dengan tepat, lalu simpan dan tutup file:package yourGroupId.yourGroupId.security; import com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cOidcLoginConfigurer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { private final AadB2cOidcLoginConfigurer configurer; public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) { this.configurer = configurer; } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest() .authenticated() .and() .apply(configurer) ; } }
Salin file home.html dari sampel spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application ke src/main/resources/templates, dan ganti
${your-profile-edit-user-flow}
dan${your-password-reset-user-flow}
dengan nama alur pengguna yang Anda buat sebelumnya.
Membuat dan menguji aplikasi Anda
Buka perintah dan ubah direktori ke folder tempat file pom.xml aplikasi Anda berada.
Bangun aplikasi Spring Boot Anda dengan Maven dan jalankan aplikasinya, misalnya:
Catatan
Sangat penting bahwa waktu sesuai dengan jam sistem tempat aplikasi spring boot lokal berjalan akurat. Ada sangat sedikit toleransi clock skew saat menggunakan OAuth 2.0. Bahkan tiga menit ketidakakuratan dapat menyebabkan masuk gagal dengan kesalahan yang mirip dengan
[invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z
. Pada tulisan ini, time.gov memiliki indikator seberapa jauh jam Anda dari waktu yang sebenarnya. Aplikasi ini berhasil dijalankan dengan kemiringan +0,019 detik.mvn -DskipTests clean package mvn -DskipTests spring-boot:run
Setelah aplikasi Anda dibuat dan dimulai oleh Maven, buka
http://localhost:8080/
di browser web; Anda harus diarahkan ke halaman masuk.Pilih tautan dengan teks yang berkaitan dengan proses masuk. Anda harus diarahkan Azure AD B2C untuk memulai proses autentikasi.
Setelah berhasil masuk, Anda akan melihat sampel
home page
dari browser,
Pemecahan Masalah
Bagian berikut menjelaskan cara menyelesaikan beberapa masalah yang mungkin Anda temui.
Nama atribut yang hilang dalam atribut
Saat menjalankan sampel, Anda mungkin mendapatkan pengecualian dengan pesan Missing attribute 'name' in attributes
. Log untuk pengecualian ini akan terlihat mirip dengan output berikut:
java.lang.IllegalArgumentException: Missing attribute 'name' in attributes
at org.springframework.security.oauth2.core.user.DefaultOAuth2User.<init>(DefaultOAuth2User.java:67) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser.<init>(DefaultOidcUser.java:89) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:144) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:63) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
Jika Anda mendapatkan kesalahan ini, periksa kembali alur kerja pengguna yang Anda buat di Tutorial: Membuat alur pengguna di Azure Active Directory B2C. Saat membuat alur kerja pengguna, untuk Atribut dan klaim Pengguna, pastikan untuk memilih atribut dan klaim untuk Nama Tampilan. Juga, pastikan untuk mengonfigurasi user-name-attribute-name
dengan benar dalam file application.yml.
Masuk dengan perulangan ke titik akhir B2C
Masalah ini kemungkinan besar disebabkan oleh cookie yang tercemar untuk localhost
. Bersihkan cookie untuk localhost
dan coba lagi.
Ringkasan
Dalam tutorial ini, Anda membuat aplikasi web Java baru menggunakan starter B2C Azure Active Directory, mengonfigurasi penyewa Azure AD B2C baru, dan mendaftarkan aplikasi baru di dalamnya, lalu mengonfigurasi aplikasi Anda untuk menggunakan anotasi dan kelas Spring untuk melindungi aplikasi web.
Membersihkan sumber daya
Bila tidak lagi diperlukan, gunakan portal Azure untuk menghapus sumber daya yang dibuat dalam artikel ini untuk menghindari biaya tak terduga.
Langkah berikutnya
Untuk mempelajari selengkapnya tentang Spring dan Azure, lanjutkan ke pusat dokumentasi Spring di Azure.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk