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í Spring Initializr pomocí úvodní sady Spring Boot pro ID Microsoft Entra.
V tomto kurzu se naučíte:
- Vytvoření aplikace v Javě pomocí aplikace Spring Initializr
- Konfigurace Azure Active Directory B2C
- Zabezpečení aplikace pomocí tříd a poznámek Spring Boot
- Sestavení a otestování aplikace v Javě
Microsoft Entra ID je cloudové řešení podnikové identity od Microsoftu. Azure Active Directory B2C pochválí sadu funkcí Microsoft Entra ID, která umožňuje spravovat přístup zákazníků, spotřebitelů a občanů k vašim aplikacím typu business-to-consumer (B2C).
Požadavky
- Předplatné Azure. Pokud ho ještě nemáte, vytvořte si bezplatný účet, než začnete.
- Podporované vývojové prostředí Java (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 Stack.
- 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 Projectvyberte Maven projekt.
- V části Language(Jazyk) vyberte Java.
- V části Spring Bootvyberte 2.7.11.
- V části Group, Artifact a Name zadejte 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 řešily následující zprávu CVE CVE-2021-22119: útok odmítnutí služby s komponentou spring-security-oauth2-client. Pokud používáte starší verzi, upgradujte ji.
Vyberte Vygenerovat projekta poté stáhněte projekt do zadané složky 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 Group 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 služby Active Directory
Přihlaste se k https://portal.azure.com.
Vyberte Vytvořit prostředek. Vyhledejte Azure Active Directory B2C.
Vyberte Vytvořit.
Vyberte Vytvořit nové předplatné Azure AD B2C.
V název organizace a počáteční název doményzadejte příslušné 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 možnost Přepnout adresářa poté zvolte 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 pro vaši aplikaci Spring Boot
V podokně Spravovat vyberte Registrace aplikacía poté vyberte Nová registrace.
Do pole Název zadejte název své aplikace a poté vyberte Zaregistrovat.
Zpět v podokně Spravovat vyberte Registrace aplikacía pak vyberte název vámi vytvořené aplikace.
Vyberte ověřování, pak přidejte platformu a poté web. Nastavte URI přesměrování na
http://localhost:8080/login/oauth2/code/
, poté vyberte Konfigurovat.
Přidání tajných kódů aplikací pro vaši aplikaci
Vyberte Certifikáty & tajemství, pak Nové klientské tajemství. Zadejte popis tajného kódu a 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.
obrazovka
Poznámka
Pokud opustíte oddíl Certifikáty & tajných kódů a vrátíte se, nebudete moct zobrazit 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ý apostrof. V takovém případě tento tajný klíč zahoďte a vygenerujte jiný.
Přidání uživatelského toku
Přejděte na hlavní stránku tenanta. V části „Zásady“ v levém podokně vyberte „Toky uživatelů“ a poté 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 toku nového uživatele.
- Pokud se tento kurz týká
webapp1
, použijte místo toho hodnotu, kterou jste zadali pro Group. - Když vybíráte položky, které se mají vrátit z toků, ujistěte se, že je vybrán 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čí. Očekává se to.
- Až se dostanete na "Další kroky", vraťte se do tohoto kurzu.
Postupujte podle všech kroků v kurzu : Vytváření toků uživatelů v Azure Active Directory B2C vytvář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 GitHub najdete viz 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 pomocí příkazu `cd`, do kterého jste rozbalili soubor .zip, který jste stáhli ze 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.xmlzá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
spring-cloud-azure-starter-active-directory-b2c
použijte nejnovější dostupnou verzi. Možná budete moct toto vyhledat pomocí mvnrepository.com.Pro
spring-boot-starter-thymeleaf
použijte verzi odpovídající verzi Spring Bootu, kterou jste vybrali výše, například2.3.4.RELEASE
.Pro
thymeleaf-extras-springsecurity5
použijte nejnovější dostupnou verzi. Možná budete moct použít mvnrepository.com k ověření tohoto. K dnešnímu dni je nejnovější verze3.0.4.RELEASE
.Uložte a zavřete soubor pom.xml.
- Spuštěním
mvn -DskipTests clean install
ověřte správnost závislostí. Pokud nevidíteBUILD SUCCESS
, odstraňte problém předtím, než budete pokračovat.
- 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 aplikace pomocí hodnot, které jste vytvořili dříve; 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 hodnota
client-secret
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 v jednoduchých uvozovkách, pokud jsou přítomné v YAML.Poznámka
K datu tohoto zápisu je úplný seznam hodnot Spring Integrace 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>vytvořte složku s názvem controller , přičemž
<yourGroupId>
nahraďte hodnotou, kterou jste zadali pro Group.Ve složce kontroleru
vytvořte nový soubor Java s názvem WebController.java a otevřete ho v textovém editoru.Zadejte následující kód, odpovídajícím způsobem změň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 v kontroleru volá
initializeModel()
a tato metoda volámodel.addAllAttributes(user.getAttributes());
, všechny stránky HTML v src/main/resources/templates mají přístup k některým z těchto atributů, jako jsou${name}
,${grant_type}
nebo${auth_time}
. Hodnoty vrácené zuser.getAttributes()
jsou ve skutečnosti nárokyid_token
pro účely ověřování. Úplný seznam dostupných nároků je uvedený v ID tokenech platformy Microsoft.Vytvořte složku s názvem security v src/main/java/<yourGroupId>/<yourGroupId>a nahraďte
yourGroupId
hodnotou, kterou jste zadali pro Group.Ve složce zabezpečení
vytvořte nový soubor Java s názvem WebSecurityConfiguration.java a otevřete ho v textovém editoru.Zadejte následující kód, odpovídajícím způsobem změň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/templatesa nahraďte
${your-profile-edit-user-flow}
a${your-password-reset-user-flow}
názvy toků uživatelů, které jste vytvořili dříve.
Sestavení a otestování aplikace
Otevřete příkazový řádek a změňte adresář 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, byl přesný. Při použití OAuth 2.0 je velmi malá tolerance nerovnoměrné distribuce hodin. Již 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
. V době psaní tohoto textu time.gov ukazuje, jak moc se vaše hodiny liší od skutečného času. Aplikace byla úspěšně spuštěna s posunem o +0,019 sekundy.mvn -DskipTests clean package mvn -DskipTests spring-boot:run
Po sestavení a spuštění aplikace Maven otevřete
http://localhost:8080/
ve webovém prohlížeči; 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í by se měl zobrazit ukázkový příklad
home page
z prohlížeče.
Řešení problémů
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: Vytváření toků uživatelů v azure Active Directory B2C. Při vytváření uživatelského pracovního postupu, pro Atributy uživatele a deklarace identity, 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 pro 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.
Uvolnění prostředků
Pokud už je nepotřebujete, pomocí webu Azure Portal odstraňte prostředky vytvořené v tomto článku, abyste se vyhnuli neočekávaným poplatkům.
Další kroky
Další informace o Springu a Azure najdete v centru dokumentace Spring on Azure.