Přidání přihlášení pomocí Azure Active Directory B2C do webové aplikace Spring
V tomto článku se dozvíte, jak vytvořit aplikaci v Javě s funkcí přihlašování pomocí Aplikace Spring Initializr s úvodní aplikací Spring Boot pro Microsoft Entra ID.
V tomto kurzu se naučíte:
- Vytvoření aplikace v Javě pomocí aplikace Spring Initializr
- Konfigurace Azure Active Directory B2C
- Zabezpečení aplikace s využitím tříd a poznámek Spring Boot
- Sestavení a otestování aplikace v Javě
Microsoft Entra ID je řešení podnikové identity v cloudovém měřítku od Microsoftu. Azure Active Directory B2C doplňuje sadu funkcí Microsoft Entra ID, která umožňuje spravovat přístup zákazníků, spotřebitelů a občanů k vašim aplikacím B2C (business-to-consumer).
Požadavky
- Předplatné Azure. Pokud ho ještě nemáte, vytvořte si před zahájením bezplatný účet .
- Podporovaná sada Java Development Kit (JDK). Další informace o sadách JDK, které jsou k dispozici při vývoji v Azure, najdete v tématu Podpora Javy v Azure a azure Stacku.
- Apache Maven verze 3.0 nebo vyšší.
Důležité
K dokončení kroků v tomto článku se vyžaduje Spring Boot verze 2.5 nebo vyšší.
Vytvoření aplikace pomocí aplikace Spring Initializr
Přejděte na https://start.spring.io/.
Vyplňte hodnoty podle těchto pokynů. Popisky a rozložení se můžou lišit od obrázku zobrazeného tady.
- V části Projekt vyberte Projekt Maven.
- V části Jazyk vyberte Javu.
- V části Spring Boot vyberte 2.7.11.
- V části Skupina zadejte artefakt a název stejnou hodnotu pomocí krátkého popisného řetězce. Uživatelské rozhraní může při psaní automaticky vyplnit některá z těchto polí.
- V podokně Závislosti vyberte Přidat závislosti. Pomocí uživatelského rozhraní můžete přidat závislosti na Spring Web a Spring Security.
Poznámka:
Spring Security 5.5.1, 5.4.7, 5.3.10 a 5.2.11 byly vydány, aby vyřešily následující zprávu CVE-2021-22119: Útok DoS s spring-security-oauth2-client. Pokud používáte starší verzi, upgradujte ji.
Vyberte Vygenerovat projekt a pak stáhněte projekt do cesty na místním počítači. Přesuňte stažený soubor do adresáře pojmenovaného po projektu a rozbalte ho. Rozložení souboru by mělo vypadat přibližně takto, s hodnotou, kterou jste zadali pro skupinu místo
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
Vytvoření a inicializace instance Microsoft Entra
Vytvoření instance Active Directory
Přihlaste se na adrese https://portal.azure.com.
Vyberte Vytvořit prostředek. Vyhledejte Azure Active Directory B2C.
Vyberte Vytvořit.
Vyberte Vytvořit nového klienta Azure AD B2C.
Jako název organizace a počáteční název domény zadejte odpovídající hodnoty a pak vyberte Vytvořit.
Po dokončení vytváření služby Active Directory vyberte svůj účet v pravém horním rohu, vyberte Přepnout adresář a pak vyberte vytvořený adresář. Budete přesměrováni na novou domovskou stránku tenanta. Pak vyhledejte
b2c
a vyberte Azure AD B2C.
Přidání registrace aplikace pro aplikaci Spring Boot
V podokně Správa vyberte Registrace aplikací a pak vyberte Nová registrace.
Do pole Název zadejte název aplikace a pak vyberte Zaregistrovat.
Zpět v podokně Správa vyberte Registrace aplikací a pak vyberte název aplikace, kterou jste vytvořili.
Vyberte Ověřování a pak přidejte platformu a pak web. Nastavte identifikátory URI přesměrování na
http://localhost:8080/login/oauth2/code/
a pak vyberte Konfigurovat.
Přidání tajných kódů aplikací pro vaši aplikaci
Vyberte Certifikáty a tajné kódy a pak Nové tajné kódy klienta. Zadejte popis tajného kódu a pak vyberte Přidat. Po vytvoření tajného kódu vyberte ikonu kopírování vedle hodnoty tajného kódu a zkopírujte hodnotu pro pozdější použití v tomto článku.
Poznámka:
Pokud opustíte oddíl Certifikáty a tajné kódy a vrátíte se, neuvidíte hodnotu tajného kódu. V takovém případě musíte vytvořit další tajný klíč a zkopírovat ho pro budoucí použití. Vygenerovaná hodnota tajného kódu může někdy obsahovat znaky, které jsou problematické pro zahrnutí do souboru application.yml , například zpětné lomítko nebo zpětné lomítko. V takovém případě tento tajný klíč zahoďte a vygenerujte jiný.
Přidání toku uživatele
Přejděte na hlavní stránku tenanta. V části Zásady v levém podokně vyberte Toky uživatelů a pak vyberte Nový tok uživatele.
Teď tento kurz opustíte, spustíte další kurz a až budete hotovi, vraťte se k tomuto kurzu. Tady je několik věcí, které byste měli mít na paměti, když přejdete do jiného kurzu.
- Začněte krokem, který vás požádá o výběr nového toku uživatele.
- Pokud tento kurz odkazuje na
webapp1
hodnotu, kterou jste zadali pro skupinu , použijte místo toho hodnotu. - Když vybíráte deklarace identity, které se mají vrátit z toků, ujistěte se, že je vybraný zobrazovaný název . Bez této deklarace identity nebude aplikace vytvořená v tomto kurzu fungovat.
- Když se zobrazí výzva ke spuštění toků uživatelů, adresa URL pro přesměrování, kterou jste zadali dříve, ještě není aktivní. Toky můžete pořád spouštět, ale přesměrování se úspěšně nedokončí. To se očekává.
- Až se dostanete na "Další kroky", vraťte se do tohoto kurzu.
Postupujte podle všech kroků v kurzu: Vytvoření toků uživatelů v Azure Active Directory B2C k vytvoření toků uživatelů pro registraci a přihlášení, úpravy profilu a resetování hesla.
Azure AD B2C podporuje místní účty i zprostředkovatele sociálních identit. Příklad vytvoření zprostředkovatele identity GitHubu najdete v tématu Nastavení registrace a přihlášení pomocí účtu GitHub pomocí Azure Active Directory B2C.
Konfigurace a kompilace aplikace
Teď, když jste vytvořili instanci Azure AD B2C a některé toky uživatelů, připojíte aplikaci Spring k instanci Azure AD B2C.
Z příkazového řádku přejděte do adresáře, do kterého jste rozbalili soubor .zip, který jste stáhli z Aplikace Spring Initializr.
Přejděte do nadřazené složky projektu a otevřete soubor projektu pom.xml Maven v textovém editoru.
Přidejte do pom.xml závislosti zabezpečení Spring OAuth2:
<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>
Pro tuto
spring-cloud-azure-starter-active-directory-b2c
možnost použijte nejnovější dostupnou verzi. Možná budete moct tuto funkci vyhledat pomocí mvnrepository.com .spring-boot-starter-thymeleaf
Pro , použijte verzi odpovídající verzi Spring Boot, kterou jste vybrali výše, například2.3.4.RELEASE
.Pokud chcete
thymeleaf-extras-springsecurity5
, použijte nejnovější dostupnou verzi. Možná budete moct tuto funkci vyhledat pomocí mvnrepository.com . Od tohoto psaní je nejnovější verze3.0.4.RELEASE
.Uložte a zavřete soubor pom.xml.
- Spuštěním
mvn -DskipTests clean install
příkazu ověřte správnost závislostí. Pokud se vám nezobrazíBUILD SUCCESS
, před pokračováním problém vyřešte a vyřešte ho.
- Spuštěním
Přejděte do složky src/main/resources v projektu a vytvořte soubor application.yml v textovém editoru.
Zadejte nastavení registrace vaší aplikace s použitím dříve vytvořených hodnot. Například:
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>
Všimněte si, že
client-secret
hodnota je uzavřena v jednoduchých uvozovkách. To je nezbytné, protože hodnota<secret-value>
bude téměř jistě obsahovat některé znaky, které vyžadují, aby byly uvnitř jednoduchých uvozovek, pokud jsou přítomné v YAML.Poznámka:
Od tohoto zápisu je úplný seznam hodnot integrace spring služby Active Directory B2C, které jsou k dispozici pro použití v application.yml , následující:
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:
Soubor application.yml je k dispozici v ukázce spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application na GitHubu.
Uložte a zavřete soubor application.yml.
Ve src/main/java/yourGroupId>/yourGroupId/<yourGroupId> vytvořte složku s názvem kontroleru a nahraďte
<yourGroupId>
hodnotou, kterou jste zadali pro skupinu.<Ve složce controller vytvořte nový soubor Java WebController.java a otevřete ho v textovém editoru.
Zadejte následující kód, který odpovídajícím způsobem změníte
yourGroupId
, a pak soubor uložte a zavřete: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"; } }
Vzhledem k tomu, že každá metoda ve volání
initializeModel()
kontroleru a tato metoda volámodel.addAllAttributes(user.getAttributes());
, každá stránka HTML v src/main/resources/templates je schopna získat přístup k některému z těchto atributů, například${name}
,${grant_type}
nebo${auth_time}
. Hodnoty vrácené zuser.getAttributes()
ověřování jsou ve skutečnosti deklarace identityid_token
ověřování. Úplný seznam dostupných deklarací identity je uvedený v tokenech ID platformy Microsoft Identity Platform.Vytvořte složku s názvem security in src/main/java/<yourGroupId>/<yourGroupId> a nahraďte
yourGroupId
hodnotou, kterou jste zadali pro skupinu.Ve složce security vytvořte nový soubor Java WebSecurityConfigation.java a otevřete ho v textovém editoru.
Zadejte následující kód, který odpovídajícím způsobem změníte
yourGroupId
, a pak soubor uložte a zavřete: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) ; } }
Zkopírujte soubor home.html z ukázky spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application do src/main/resources/templates a nahraďte
${your-profile-edit-user-flow}
názvy${your-password-reset-user-flow}
toků uživatelů, které jste vytvořili dříve.
Sestavení a otestování aplikace
Otevřete příkazový řádek a přejděte do složky, ve které se nachází soubor pom.xml vaší aplikace.
Sestavte aplikaci Spring Boot pomocí Mavenu a spusťte ji. Například:
Poznámka:
Je velmi důležité, aby čas podle systémových hodin, pod kterými běží místní aplikace Spring Boot, byla přesná. Při použití OAuth 2.0 je velmi malá tolerance nerovnoměrné distribuce hodin. I tři minuty nepřesnosti mohou způsobit selhání přihlášení s chybou podobnou
[invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z
. Od tohoto psaní má time.gov indikátor, jak daleko je vaše hodiny od skutečného času. Aplikace byla úspěšně spuštěna se nerovnoměrnou distribuci +0,019 sekund.mvn -DskipTests clean package mvn -DskipTests spring-boot:run
Po sestavení a spuštění aplikace pomocí Mavenu ve webovém prohlížeči přejděte na adresu
http://localhost:8080/
. Měli byste být přesměrováni na přihlašovací stránku.Vyberte odkaz s textem souvisejícím s přihlášením. Měli byste být přesměrováni na Azure AD B2C a zahájit proces ověřování.
Po úspěšném přihlášení byste měli vidět ukázku
home page
z prohlížeče.
Řešení problému
Následující části popisují, jak vyřešit některé problémy, se kterými se můžete setkat.
Chybějící název atributu v atributech
Při spuštění ukázky se může zobrazit výjimka se zprávou Missing attribute 'name' in attributes
. Protokol pro tuto výjimku bude vypadat podobně jako následující výstup:
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]
Pokud se zobrazí tato chyba, pečlivě zkontrolujte pracovní postup uživatele, který jste vytvořili v kurzu: Vytvoření toků uživatelů v Azure Active Directory B2C. Při vytváření uživatelského pracovního postupu pro atributy a deklarace identity uživatele nezapomeňte zvolit atributy a deklarace identity pro zobrazovaný název. Nezapomeňte také správně nakonfigurovat user-name-attribute-name
v souboru application.yml .
Přihlášení pomocí smyček ke koncovému bodu B2C
Příčinou tohoto problému je pravděpodobně znečisťované soubory cookie pro localhost
. Vyčistěte soubory cookie localhost
a zkuste to znovu.
Shrnutí
V tomto kurzu jste vytvořili novou webovou aplikaci v Javě pomocí úvodní sady Azure Active Directory B2C, nakonfigurovali jste nového tenanta Azure AD B2C a zaregistrovali jste v něm novou aplikaci a pak jste aplikaci nakonfigurovali tak, aby používala poznámky a třídy Spring k ochraně webové aplikace.
Vyčištění prostředků
Až už je nebudete potřebovat, odstraňte na webu Azure Portal prostředky vytvořené v tomto článku, aby se vám neúčtovaly poplatky.
Další kroky
Pokud se chcete dozvědět více o architektuře Spring a Azure, přejděte do centra dokumentace Spring v Azure.