Adicionar início de sessão com o Azure Ative Directory B2C a uma aplicação Web Spring
Este artigo mostra como criar um aplicativo Java com capacidade de entrada usando Spring Initializr com o Spring Boot Starter para Microsoft Entra ID.
Neste tutorial, você aprenderá a:
- Criar um aplicativo Java usando o Spring Initializr
- Configurar o Azure Active Directory B2C
- Proteja o aplicativo com classes e anotações do Spring Boot
- Construa e teste sua aplicação Java
Microsoft Entra ID é a solução de identidade empresarial em escala de nuvem da Microsoft. Azure Ative Directory B2C complementa o conjunto de recursos do Microsoft Entra ID, permitindo que você gerencie o acesso de clientes, consumidores e cidadãos aos seus aplicativos B2C (business-to-consumer).
Pré-requisitos
- Uma assinatura do Azure. Se ainda não tiver uma, crie uma conta gratuita antes de começar.
- Um Java Development Kit (JDK) suportado. Para obter mais informações sobre os JDKs disponíveis para uso ao desenvolver no Azure, consulte suporte Java no Azure e Azure Stack.
- Apache Maven, versão 3.0 ou superior.
Importante
O Spring Boot versão 2.5 ou superior é necessário para concluir as etapas neste artigo.
Criar um aplicativo usando o Spring Initializr
Navegue até https://start.spring.io/.
Preencha os valores de acordo com esta orientação. Os rótulos e o layout podem diferir da imagem mostrada aqui.
- Em Project, selecione Maven Project.
- Em Language, selecione Java.
- Em Spring Boot, selecione 2.7.11.
- Em Grupo, Artefato e Nome, insira o mesmo valor, usando uma string descritiva curta. A interface do usuário pode preencher automaticamente alguns desses campos à medida que você digita.
- No painel de
Dependências , selecioneAdicionar Dependências. Use a interface de utilizador para adicionar dependências para Spring Web e Spring Security.
Observação
Spring Security 5.5.1, 5.4.7, 5.3.10 e 5.2.11 foram lançados para tratar o seguinte relatório CVE CVE-2021-22119: Ataque de negação de serviço com spring-security-oauth2-client. Se você estiver usando a versão mais antiga, atualize-a.
Selecione Gerar projetoe, em seguida, transfira o projeto para um caminho no computador local. Mova o arquivo baixado para um diretório com o nome do seu projeto e descompacte o arquivo. O layout do arquivo deve ser semelhante ao seguinte, com o valor inserido para Grupo no lugar de
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
Criar e inicializar uma instância do Microsoft Entra
Criar a instância do Ative Directory
Faça login em https://portal.azure.com.
Selecione Criar um recurso. Pesquisar Azure Active Directory B2C.
Selecione Criar.
Selecione Criar um novo locatário do Azure AD B2C.
Para nome da organização e nome de domínio inicial, forneça os valores apropriados e selecione Criar.
Quando a criação do Ative Directory estiver concluída, selecione sua conta no canto superior direito, selecione Alternar diretórioe, em seguida, selecione o diretório criado. Você será redirecionado para a página inicial do novo locatário. Em seguida, procure
b2c
e selecione Azure AD B2C.
Adicionar um registro de aplicativo para seu aplicativo Spring Boot
No painel Gerir, selecione Registos de aplicaçõese, em seguida, selecione Novo registo.
No campo Nome, introduza o nome da sua app e, depois, selecione Registar.
De volta ao painel Gerir, selecione Registos de aplicaçõese, em seguida, selecione o nome da aplicação que criou.
Selecione Autenticação, depois Adicionar uma plataforma, depois Web. Defina o
Redirecionar URIs como e, em seguida, selecione Configurar .
Adicionar segredos de aplicativo para seu aplicativo
Selecione Certificados & segredos, depois Segredos de cliente novos. Introduza a descrição secreta e, em seguida, selecione Adicionar. Depois de criar o segredo, selecione o ícone de cópia ao lado do valor secreto para copiar o valor para uso posterior neste artigo.
Observação
Se você deixar a seção Certificados & segredos e voltar, não poderá ver o valor secreto. Nesse caso, você deve criar outro segredo e copiá-lo para uso futuro. Ocasionalmente, o valor secreto gerado pode conter caracteres que são problemáticos para inclusão no ficheiro application.yml, como barra invertida ou acento grave. Nesse caso, descarte esse segredo e gere outro.
Adicionar fluxo de usuário
Navegue até a página principal do locatário. Na seção Políticas do painel esquerdo, selecione Fluxos de Utilizadore, em seguida, selecione Novo Fluxo de Utilizador.
Agora você sairá deste tutorial, executará outro tutorial e voltará a este tutorial quando terminar. Aqui estão algumas coisas para ter em mente quando você vai para o outro tutorial.
- Comece com a etapa que solicita que selecione Fluxo de Novo Utilizador.
- Quando este tutorial se referir a
webapp1
, em vez disso, use o valor que inseriu para o Grupo . - Ao selecionar as declarações a serem retornadas dos fluxos, verifique se Nome para Exibição está selecionado. Sem essa afirmação, o aplicativo que está sendo criado neste tutorial não funcionará.
- Quando você é solicitado a executar os fluxos de usuário, a URL de redirecionamento especificada anteriormente ainda não está ativa. Você ainda pode executar os fluxos, mas o redirecionamento não será concluído com êxito. Isso é esperado.
- Quando chegar a "Próximos passos", volte a este tutorial.
Siga todas as etapas em Tutorial: Criar fluxos de usuário no Azure Ative Directory B2C criar fluxos de usuário para "inscrição e entrada", "edição de perfil" e "redefinição de senha".
O Azure AD B2C dá suporte a contas locais, bem como provedores de identidade social. Para obter um exemplo de criação de um provedor de identidade GitHub, consulte Configurar inscrição e entrada com uma conta do GitHub usando o Azure Ative Directory B2C.
Configurar e compilar seu aplicativo
Agora que você criou a instância do Azure AD B2C e alguns fluxos de usuário, conectará seu aplicativo Spring à instância do Azure AD B2C.
A partir da linha de comando, cd para o diretório onde você descompactou o arquivo .zip que você baixou do Spring Initializr.
Navegue até a pasta pai do seu projeto e abra o arquivo de projeto pom.xml Maven em um editor de texto.
Adicione as dependências de segurança do Spring OAuth2 ao 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>
Para o
spring-cloud-azure-starter-active-directory-b2c
, use a versão mais recente disponível. Você pode ser capaz de usar mvnrepository.com para procurar isso.Para o
spring-boot-starter-thymeleaf
, use a versão correspondente à versão do Spring Boot que você selecionou acima, por exemplo,2.3.4.RELEASE
.Para
thymeleaf-extras-springsecurity5
, use a versão mais recente disponível. Você pode ser capaz de usar mvnrepository.com para procurar isso. No momento em que este artigo foi escrito, a versão mais recente é3.0.4.RELEASE
.Salve e feche o arquivo pom.xml.
- Verifique se suas dependências estão corretas executando
mvn -DskipTests clean install
. Se não virBUILD SUCCESS
, identifique e resolva o problema antes de continuar.
- Verifique se suas dependências estão corretas executando
Navegue até a pasta src/main/resources em seu projeto e crie um arquivo application.yml em um editor de texto.
Especifique as configurações para o registro do seu aplicativo usando os valores criados anteriormente; Por exemplo:
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>
Observe que o valor
client-secret
está entre aspas simples. Isso é necessário porque o valor de<secret-value>
quase certamente conterá alguns caracteres que exigem estar dentro de aspas simples quando presentes no YAML.Observação
No momento em que este artigo foi escrito, a lista completa de valores do Ative Directory B2C Spring Integration que estão disponíveis para uso no application.yml é a seguinte:
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:
O ficheiro application.yml está disponível no exemplo de spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application no GitHub.
Salve e feche o arquivo application.yml.
Crie uma pasta chamada controlador em src/main/java/<yourGroupId>/<yourGroupId>, substituindo
<yourGroupId>
pelo valor que você inseriu para Grupo.Crie um novo arquivo Java chamado
WebController.java na pasta do controladore abra-o em um editor de texto. Digite o seguinte código, alterando
yourGroupId
apropriadamente, salve e feche o arquivo: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"; } }
Como cada método no controlador chama
initializeModel()
, e esse método chamamodel.addAllAttributes(user.getAttributes());
, qualquer página HTML em src/main/resources/templates é capaz de acessar qualquer um desses atributos, como${name}
,${grant_type}
ou${auth_time}
. Os valores retornados deuser.getAttributes()
são, na verdade, as reivindicações doid_token
para a autenticação. A lista completa de declarações disponíveis está listada em tokens de ID da plataforma de identidade da Microsoft.Crie uma pasta chamada de segurança em src/main/java/<yourGroupId>/<yourGroupId>, substituindo
yourGroupId
pelo valor que você inseriu para Grupo.Crie um novo arquivo Java chamado WebSecurityConfiguration.java na pasta security e abra-o em um editor de texto.
Digite o seguinte código, alterando
yourGroupId
apropriadamente, salve e feche o arquivo: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) ; } }
Copie o arquivo home.html de exemplo spring-cloud-azure-starter-active-directory-b2c: aad-b2c-web-application para src/main/resources/templatese substitua o
${your-profile-edit-user-flow}
e o${your-password-reset-user-flow}
pelos nomes dos fluxos de usuário criados anteriormente.
Crie e teste seu aplicativo
Abra um prompt de comando e altere o diretório para a pasta onde o arquivo pom.xml do seu aplicativo está localizado.
Construa seu aplicativo Spring Boot com o Maven e execute-o; Por exemplo:
Observação
É extremamente importante que a hora de acordo com o relógio do sistema sob a qual a aplicação Spring Boot local é executada seja precisa. Há muito pouca tolerância de distorção de relógio ao usar OAuth 2.0. Mesmo três minutos de imprecisão podem fazer com que o login falhe com um erro semelhante ao
[invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z
. No momento em que este artigo foi escrito, time.gov tem um indicador de quão desfasado o seu relógio está em relação à hora real. O aplicativo foi executado com sucesso com uma inclinação de +0,019 segundos.mvn -DskipTests clean package mvn -DskipTests spring-boot:run
Depois que seu aplicativo for criado e iniciado pelo Maven, abra
http://localhost:8080/
em um navegador da web; Você deve ser redirecionado para a página de login.Selecione o link com o texto relacionado ao login. Você deve ser redirecionado para o Azure AD B2C para iniciar o processo de autenticação.
Depois de iniciar sessão com êxito, deverá ver a amostra
home page
no navegador.
Solução de problemas
As seções a seguir descrevem como resolver alguns problemas que você pode encontrar.
Nome do atributo ausente nos atributos
Ao executar o exemplo, você pode obter uma exceção com a mensagem Missing attribute 'name' in attributes
. O log desta exceção será parecido com a saída seguinte:
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]
Se você receber esse erro, verifique novamente o fluxo de trabalho de usuário criado em Tutorial: Criar fluxos de usuário no Azure Ative Directory B2C. Ao criar o fluxo de trabalho do utilizador, para os atributos e declarações do usuário , certifique-se de escolher atributos e declarações para Nome de Exibição. Além disso, certifique-se de configurar corretamente user-name-attribute-name
no arquivo application.yml.
Iniciar sessão com loops no endpoint B2C
Este problema é provavelmente devido a cookies poluídos para localhost
. Limpe os cookies para localhost
e tente novamente.
Resumo
Neste tutorial, você criou um novo aplicativo Web Java usando o iniciador B2C do Azure Ative Directory, configurou um novo locatário do Azure AD B2C e registrou um novo aplicativo nele e, em seguida, configurou seu aplicativo para usar as anotações e classes Spring para proteger o aplicativo Web.
Limpar recursos
Quando não for mais necessário, use o do portal do
Próximos passos
Para saber mais sobre o Spring e o Azure, continue para o centro de documentação do Spring on Azure.