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

Penting

Spring Boot versi 2.5 atau yang lebih tinggi diperlukan untuk menyelesaikan langkah-langkah dalam artikel ini.

Membuat aplikasi menggunakan Spring Initializr

  1. Telusuri https://start.spring.io/.

  2. 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.

  3. 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

  1. Masuk ke https://portal.azure.com.

  2. Pilih Buat sumber daya. Cari Azure Active Directory B2C.

    Buat instans Azure Active Directory B2C baru menggunakan portal Azure.

  3. Pilih Buat.

    Marketplace Azure entri untuk Azure Active Directory B2C.

  4. Pilih Buat Penyewa Azure AD B2C baru.

    portal Azure opsi untuk membuat Penyewa Azure AD B2C baru.

  5. Untuk Nama organisasi dan nama domain Awal, berikan nilai yang sesuai, lalu pilih Buat.

    Layar Buat Penyewa Azure AD B2C.

  6. 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.

    Temukan layanan Azure AD B2C.

Menambahkan pendaftaran aplikasi untuk aplikasi Spring Boot Anda

  1. Di panel Kelola, pilih Pendaftaran aplikasi, lalu pilih Pendaftaran baru.

    Cuplikan layar portal Azure memperlihatkan layar Pendaftaran aplikasi Azure AD B2C.

  2. Di bidang Nama, masukkan nama aplikasi Anda, lalu pilih Daftar.

    Azure AD B2C mendaftarkan formulir aplikasi.

  3. Kembali ke panel Kelola, pilih Pendaftaran aplikasi, lalu pilih nama aplikasi yang Anda buat.

    Pendaftaran aplikasi layar dengan nama tampilan dipilih.

  4. Pilih Autentikasi, lalu Tambahkan platform lalu Web. Atur URI Pengalihan ke http://localhost:8080/login/oauth2/code/, lalu pilih Konfigurasikan.

    Opsi yang dipilih untuk autentikasi, tambahkan platform, web.

    Konfigurasikan layar Web dengan bidang URI Pengalihan dipilih.

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.

Tambahkan layar rahasia klien.

Layar sertifikat dan rahasia dengan tombol salin dipilih.

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

  1. Navigasikan ke halaman utama penyewa Anda. Di bagian Kebijakan di panel kiri, pilih Alur pengguna, lalu pilih Alur pengguna baru.

  2. 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.

  1. Dari baris perintah, cd ke direktori tempat Anda mengekstrak file .zip yang Anda unduh dari Spring Initializr.

  2. Navigasikan ke folder induk untuk proyek Anda, dan buka file proyek Maven pom.xml di editor teks.

  3. 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, misalnya 2.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 adalah 3.0.4.RELEASE.

  4. Simpan dan tutup file pom.xml.

    • Verifikasi bahwa dependensi Anda benar dengan menjalankan mvn -DskipTests clean install. Jika Anda tidak melihat BUILD SUCCESS, pecahkan masalah dan selesaikan masalah sebelum melanjutkan.
  5. Navigasikan ke folder src/main/resources di proyek Anda dan buat file application.yml di editor teks.

  6. 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.

  7. Simpan dan tutup file application.yml.

  8. Buat folder bernama controller di src/main/java/<yourGroupId>/<yourGroupId>, mengganti <yourGroupId> dengan nilai yang Anda masukkan unuk Grup.

  9. Buat file Java baru bernama WebController.java di folder pengontrol dan buka di editor teks.

  10. 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 memanggil model.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 dari user.getAttributes() sebenarnya adalah klaim id_token untuk autentikasi. Daftar lengkap klaim yang tersedia tercantum dalam token ID platform identitas Microsoft.

  11. Buat folder bernama keamanan di src/main/java/<yourGroupId>/<yourGroupId>, mengganti yourGroupId dengan nilai yang Anda masukkan untuk Group.

  12. Buat file Java baru bernama WebSecurityConfiguration.java di folder keamanan dan buka di editor teks.

  13. 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)
            ;
        }
    }
    
  14. 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

  1. Buka perintah dan ubah direktori ke folder tempat file pom.xml aplikasi Anda berada.

  2. 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
    
  3. Setelah aplikasi Anda dibuat dan dimulai oleh Maven, buka http://localhost:8080/ di browser web; Anda harus diarahkan ke halaman masuk.

    Halaman masuk aplikasi web.

  4. Pilih tautan dengan teks yang berkaitan dengan proses masuk. Anda harus diarahkan Azure AD B2C untuk memulai proses autentikasi.

  5. Setelah berhasil masuk, Anda akan melihat sampel home page dari browser,

    Aplikasi web berhasil masuk.

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.