Proteger aplicativos Java Spring Boot usando o Azure Active Directory B2C
Este artigo apresenta um aplicativo Web Java Spring Boot que conecta usuários em seu locatário do Azure Active Directory B2C usando a biblioteca de clientes do Azure AD B2C Spring Boot Starter para Java. Ele usa o protocolo OpenID Connect.
O diagrama a seguir mostra a topologia do aplicativo:
O aplicativo cliente usa a biblioteca de clientes do Azure AD B2C Spring Boot Starter para Java para conectar um usuário e obter um token de ID do Azure AD B2C. O token de ID confirma que o usuário está autenticado no Azure AD B2C e permite que ele acesse rotas protegidas.
Pré-requisitos
- Versão 15 do JDK: Este exemplo foi desenvolvido em um sistema com Java 15, mas pode ser compatível com outras versões.
- Maven 3
- O Pacote de extensão Java para Visual Studio Code é recomendado para executar este exemplo no Visual Studio Code.
- Um locatário do Azure AD B2C. Para obter mais informações, consulte Tutorial: Criar um locatário do Azure Active Directory B2C
- Visual Studio Code
- Ferramentas do Azure para o Visual Studio Code
Recomendações
- Alguma familiaridade com o Spring Framework.
- Alguma familiaridade com o terminal Linux/OSX.
- jwt.ms para inspecionar seus tokens.
- Fiddler para monitorar sua atividade de rede e solução de problemas.
- Siga o Blog do Microsoft Entra ID para se atualizar com os desenvolvimentos mais recentes.
Configurar o exemplo
As seções a seguir mostram como configurar o aplicativo de exemplo.
Clone ou baixe o repositório de exemplo.
Para clonar o exemplo, abra uma janela do Bash e use o seguinte comando:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/1-Authentication/sign-in-b2c
Como alternativa, navegue até o repositório ms-identity-msal-java-samples, baixe-o como um arquivo .zip e extraia-o para o disco rígido.
Importante
Para evitar limitações de comprimento de caminho de arquivo no Windows, clone ou extraia o repositório em um diretório próximo à raiz do disco rígido.
Este exemplo vem com um aplicativo pré-registrado para demonstração. Se você quiser usar seu próprio locatário e aplicativo do Azure AD B2C, registre e configure o aplicativo no portal do Azure. Para obter mais informações, consulte a seção Registrar o aplicativo . Caso contrário, continue com as etapas na seção Executar o exemplo .
Escolha o locatário do Azure AD B2C no qual você deseja criar seus aplicativos
Siga as etapas a seguir para escolher o locatário:
Entre no portal do Azure.
Se sua conta estiver presente em mais de um locatário do Azure AD B2C, selecione o perfil no canto do portal do Azure e selecione Mudar diretório para alterar sua sessão para o locatário do Azure AD B2C desejado.
Criar fluxos dos usuários e políticas personalizadas
Para criar fluxos de usuário comuns, como inscrição, entrada, edição de perfil e redefinição de senha, consulte Tutorial: Criar fluxos do usuário no Azure Active Directory B2C.
Você também deve considerar a criação de políticas personalizadas no Azure Active Directory B2C. No entanto, essa tarefa está além do escopo deste tutorial. Para obter mais informações, consulte Visão geral da política personalizada do Azure AD B2C.
Adicionar provedores de identidade externos
Consulte Tutorial: Adicionar provedores de identidade a seus aplicativos no Azure Active Directory B2C.
Registrar o aplicativo (java-spring-webapp-auth-b2c))
Para registrar o aplicativo, use estas etapas:
Navegue até o portal do Azure e selecione Azure AD B2C.
Selecione Registros de aplicativo no painel de navegação e selecione Novo registro.
Na página Registrar um aplicativo que aparece, insira as seguintes informações de registro do aplicativo:
- Na seção Nome, insira um nome de aplicativo relevante para exibição aos usuários do aplicativo: por exemplo,
java-spring-webapp-auth-b2c
. - Em Tipos de conta com suporte, selecione Contas em qualquer provedor de identidade ou diretório organizacional (para autenticar usuários com fluxos de usuário).
- Na seção URI de redirecionamento (opcional), selecione Web na caixa de combinação e insira o seguinte URI de redirecionamento:
http://localhost:8080/login/oauth2/code/
.
- Na seção Nome, insira um nome de aplicativo relevante para exibição aos usuários do aplicativo: por exemplo,
Selecione Registrar para criar o aplicativo.
Na página de registro do aplicativo, localize e copie o valor do ID do aplicativo (cliente) para uso posterior. Use esse valor no(s) arquivo(s) de configuração do aplicativo.
Selecione Salvar para salvar as alterações.
Na página de registo do aplicativo, selecione o painel Segredos de certificados & no painel de navegação para abrir a página para gerar segredos e carregar certificados.
Na seção Segredos do Cliente, escolha Novo Segredo do Cliente.
Insira uma descrição, por exemplo, segredo do aplicativo.
Selecione uma das durações disponíveis conforme suas preocupações de segurança, por exemplo, Em 2 anos.
Selecione Adicionar. O valor gerado é exibido.
Copie e salve o valor gerado para uso nas etapas posteriores. Esse valor é necessário para os arquivos de configuração do código. Esse valor não é exibido novamente e você não pode recuperá-lo por outros meios. Portanto, salve-o no portal do Azure antes de navegar para qualquer outra tela ou painel.
Configurar o aplicativo (java-spring-webapp-auth-b2c) para usar o registro do aplicativo
Use as seguintes etapas para configurar o aplicativo:
Observação
Nas etapas a seguir, ClientID
é o mesmo que Application ID
ou AppId
.
Abrir o projeto no seu IDE.
Abra o arquivo src/main/resources/application.yml .
Localize a propriedade
client-id
e substitua o valor existente pelo ID do aplicativo ouclientId
do aplicativojava-spring-webapp-auth-b2c
do portal do Azure.Localize a propriedade
client-secret
e substitua o valor existente pelo valor que você salvou durante a criação do aplicativojava-spring-webapp-auth-b2c
do portal do Azure.Localize a propriedade
base-uri
e substitua as duas instância do valorfabrikamb2c
pelo nome do locatário do Azure AD B2C no qual você criou o aplicativojava-spring-webapp-auth-b2c
no portal do Azure.Localize a propriedade
sign-up-or-sign-in
e substitua-a pelo nome da política de fluxo de usuário de inscrição/entrada que você criou no locatário do Azure AD B2C no qual você criou o aplicativojava-spring-webapp-auth-b2c
no portal do Azure.Localize a propriedade
profile-edit
e substitua-a pelo nome da política de fluxo de usuário de redefinição de senha que você criou no locatário do Azure AD B2C no qual você criou o aplicativojava-spring-webapp-auth-b2c
no portal do Azure.Localize a propriedade
password-reset
e substitua-a pelo nome da política de fluxo de usuário do perfil de edição que você criou no locatário do Azure AD B2C no qual você criou o aplicativojava-spring-webapp-auth-b2c
no portal do Azure.Abra o arquivo src/main/resources/templates/navbar.html .
Encontre as referências aos fluxos
b2c_1_susi
eb2c_1_edit_profile
e substitua-as por seus fluxos de usuáriosign-up-sign-in
eprofile-edit
.
Execute o exemplo
As seções a seguir mostram como implantar o exemplo no Aplicativos de Contêiner do Azure.
Pré-requisitos
- Uma conta do Azure. Crie uma conta gratuita se ainda não tiver a sua. Você precisa da permissão de Colaborador ou Proprietário na assinatura do Azure para continuar. Para obter mais informações, confira Atribuir funções do Azure usando o portal do Azure.
- O CLI do Azure.
- A extensão, versão
0.3.47
ou superior da CLI dos Aplicativos de Contêiner do Azure. Para instalar a versão mais recente, use o comandoaz extension add --name containerapp --upgrade --allow-preview
. - O Java Development Kit, versão 17 ou superior.
- Maven.
Preparar o projeto Spring
Use as etapas a seguir para preparar o projeto:
Use o comando Maven a seguir para criar o projeto:
mvn clean verify
Execute o projeto de exemplo localmente usando o seguinte comando:
mvn spring-boot:run
Instalação
Para entrar no Azure usando a CLIl, execute o comando a seguir e siga os prompts para concluir o processo de autenticação.
az login
Para garantir que você esteja executando a versão mais recente da CLI, execute o comando “upgrade”.
az upgrade
Em seguida, instale ou atualize a extensão dos Aplicativos de Contêiner do Azure para a CLI.
Se você receber erros sobre parâmetros ausentes ao executar comandos az containerapp
na CLI do Azure, verifique se você tem a versão mais recente da extensão dos Aplicativos de Contêiner do Azure instalada.
az extension add --name containerapp --upgrade
Observação
A partir de maio de 2024, as extensões da CLI do Azure já não permitem funcionalidades de versão prévia do recurso por padrão. Para acessar as versões prévias dos recursos dos Aplicativos de Contêiner, instale a extensão Aplicativos de Contêiner com --allow-preview true
.
az extension add --name containerapp --upgrade --allow-preview true
Agora que a extensão ou módulo atual está instalado, registre os namespaces Microsoft.App
e Microsoft.OperationalInsights
.
Observação
Os recursos dos Aplicativos de Contêiner do Azure migraram do namespace Microsoft.Web
para o namespace Microsoft.App
. Consulte a migração de namespace de Microsoft.Web para Microsoft.App em março de 2022 para obter mais detalhes.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Criar o ambiente de Aplicativos de Contêiner do Azure
Agora que a configuração da CLI do Azure foi concluída, você pode definir as variáveis de ambiente que são usadas ao longo deste artigo.
Defina as variáveis a seguir no shell bash.
export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"
Crie um grupos de recursos.
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION \
Criar um ambiente com um espaço de trabalho da Análise de logs gerado automaticamente.
az containerapp env create \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location $LOCATION
Mostrar o domínio padrão do ambiente do aplicativo de contêiner. Anote esse domínio para usar em seções posteriores.
az containerapp env show \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--query properties.defaultDomain
Preparar o aplicativo para implantação
Ao implantar seu aplicativo nos Aplicativos de Contêiner do Azure, a URL de redirecionamento é alterada para a URL de redirecionamento da instância do aplicativo implantado nos Aplicativos de Contêiner do Azure. Use as etapas a seguir para alterar essas configurações no arquivo application.yml:
Navegue até o arquivo src\main\resources\application.yml do aplicativo e altere o valor de
post-logout-redirect-uri
para o nome de domínio do aplicativo implantado, conforme mostrado no exemplo a seguir. Substitua<API_NAME>
e<default-domain-of-container-app-environment>
pelos valores atuais. Por exemplo, com o domínio padrão para o ambiente do Aplicativo de Contêiner do Azure da etapa anterior ems-identity-api
para o nome do aplicativo, você usariahttps://ms-identity-api.<default-domain>
para o valorpost-logout-redirect-uri
.post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
Depois de salvar esse arquivo, use o seguinte comando para recompilar o aplicativo:
mvn clean package
Importante
O arquivo application.yml do aplicativo atualmente contém o valor do segredo do cliente no parâmetro client-secret
. Não é recomendável manter esse valor nesse arquivo. Você também pode estar correndo risco se confirmar o arquivo em um repositório Git. Para obter a abordagem recomendada, consulte Gerenciar segredos nos Aplicativos de Contêiner do Azure.
Atualizar seu registro de aplicativo do Microsoft Entra ID
Como o URI de redirecionamento é alterado para o aplicativo implantado nos Aplicativos de Contêiner do Azure, você também precisa alterar o URI de redirecionamento no registro do aplicativo Microsoft Entra ID. Use as seguintes etapas para fazer essa alteração:
Navegue até a página de registros de aplicativo da plataforma de identidade da Microsoft para desenvolvedores.
Use a caixa de pesquisa para procurar o registro do aplicativo. Por exemplo,
java-servlet-webapp-authentication
.Abra o registro do aplicativo selecionando seu nome.
Selecione Autenticação no menu.
Na seção Web - URIs de redirecionamento, selecione Adicionar URI.
Preencha o URI do aplicativo, anexando
/login/oauth2/code/
, por exemplo,https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/
.Selecione Salvar.
Implantar o aplicativo
Implante o pacote JAR nos Aplicativos de Contêiner do Azure.
Observação
Se necessário, você pode especificar a versão do JDK nas variáveis de ambiente de build do Java. Para obter mais informações, confira Compilar variáveis de ambiente para Java em Aplicativos de Contêiner do Azure.
Agora você pode implantar o arquivo WAR com o comando da CLI az containerapp up
.
az containerapp up \
--name $API_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--environment $ENVIRONMENT \
--artifact <JAR_FILE_PATH_AND_NAME> \
--ingress external \
--target-port 8080 \
--query properties.configuration.ingress.fqdn
Observação
A versão padrão do JDK é 17. Se você precisar alterar a versão do JDK para compatibilidade com o seu aplicativo, poderá usar o argumento --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION>
para ajustar o número de versão.
Para obter mais variáveis de ambiente de compilação, consulte Compilar variáveis de ambiente para Java em Aplicativos de Contêiner do Azure.
Validar o aplicativo
Neste exemplo, o comando containerapp up
inclui o argumento --query properties.configuration.ingress.fqdn
, que retorna o FQDN (nome de domínio totalmente qualificado), também conhecido como URL do aplicativo. Use as seguintes etapas para verificar o log do aplicativo a fim de investigar qualquer problema de implantação:
Acesse a URL do aplicativo de saída na página Saídas da seção Implantação.
No painel de navegação da página Visão geral da instância de Aplicativos de Contêiner do Azure, selecione Logs para verificar os logs do aplicativo.
Explorar o exemplo
Use as seguintes etapas para explorar o exemplo:
- Observe o status de conectado ou desconectado exibido no centro da tela.
- Selecione o botão contextual no canto. Esse botão lê Entrar quando você executa o aplicativo pela primeira vez. Como alternativa, selecione o link para detalhes do token. Como essa página é protegida e requer autenticação, você é redirecionado automaticamente para a página de entrada.
- Na próxima página, siga as instruções e conecte-se com uma conta do provedor de identidade escolhido. Você também pode escolher inscrever-se ou conectar-se a uma conta local no locatário B2C usando um endereço de e-mail.
- Após a conclusão bem-sucedida do fluxo de entrada, você deve ser redirecionado para a página inicial, que mostra o status de entrada, ou para a página de detalhes do token, dependendo de qual botão acionou o fluxo de entrada.
- Observe que o botão contextual agora diz Sair e exibe seu nome de usuário.
- Se você estiver na página inicial, selecione Detalhes do token de ID para ver algumas das declarações decodificadas do token de ID.
- Editar o perfil. Selecione editar perfil para alterar detalhes como seu nome de exibição, local de residência e profissão.
- Use o botão no canto para sair. A página de status reflete o novo estado.
Observações sobre o código
Este exemplo apresenta como usar a biblioteca de clientes do Azure AD B2C Spring Boot Starter para Java para conectar usuários ao seu locatário do Azure AD B2C. O exemplo também usa o Spring Oauth2 Client e os iniciadores da inicialização do Spring Web. O exemplo usa declarações do token de ID obtido do Azure AD B2C para exibir os detalhes do usuário conectado.
Contents
A tabela a seguir mostra o conteúdo da pasta do projeto de exemplo:
Arquivo/pasta | Descrição |
---|---|
pom.xml | Dependências de aplicativo. |
src/main/resources/templates/ | Modelos Thymeleaf para IU. |
src/main/resources/application.yml | Configuração da biblioteca do aplicativo e do Microsoft Entra Boot Starter. |
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ | Esse diretório contém o ponto de entrada do aplicativo principal, o controlador e as classes de configuração. |
.../MsIdentitySpringBootWebappApplication.java | Classe principal. |
.../SampleController.java | Controlador com mapeamentos de ponto de extremidade. |
.../SecurityConfig.java | Configuração de segurança: por exemplo, quais rotas exigem autenticação. |
.../Utilities.java | Classe Utilitário: por exemplo, declarações de token de ID de filtro. |
CHANGELOG.md | Lista de alterações no exemplo. |
CONTRIBUTING.md | Diretrizes para contribuir com o exemplo. |
LICENÇA | A licença para o exemplo. |
Declarações de token de ID
Para extrair detalhes do token, o aplicativo usa o objeto AuthenticationPrincipal
e OidcUser
do Spring Security em um mapeamento de solicitação, conforme mostra o exemplo a seguir. Consulte o Controlador de Exemplo para obter todos os detalhes de como esse aplicativo usa declarações de token de ID.
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
Map<String, Object> claims = principal.getIdToken().getClaims();
}
Links de entrada e saída
Para entrar, o aplicativo faz uma solicitação ao ponto de extremidade de entrada do Azure AD B2C configurado automaticamente pela biblioteca de cliente Azure AD B2C Spring Boot Starter para Java, conforme mostra o exemplo a seguir:
<a class="btn btn-success" href="/oauth2/authorization/{your-sign-up-sign-in-user-flow}">Sign In</a>
Para desconectar, o aplicativo faz uma solicitação POST para o ponto de extremidade logout
, conforme mostra o exemplo a seguir:
<form action="#" th:action="@{/logout}" method="post">
<input class="btn btn-warning" type="submit" value="Sign Out" />
</form>
Elementos de IU dependentes de autenticação
O aplicativo tem uma lógica simples nas páginas de modelo da IU para determinar o conteúdo a ser exibido com base no fato de o usuário estar autenticado, conforme mostra o exemplo a seguir, usando as marcas Spring Security Thymeleaf:
<div sec:authorize="isAuthenticated()">
this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
this content only shows to not-authenticated users
</div>
Proteger rotas com WebSecurityConfigurerAdapter
Por padrão, o aplicativo protege a página Detalhes do token de ID para que apenas usuários conectados possam acessá-la. O aplicativo configura essas rotas da propriedade app.protect.authenticated
do arquivo application.yml. Para configurar os requisitos específicos do seu aplicativo, você pode estender WebSecurityConfigurerAdapter
em uma de suas classes. Para obter um exemplo, consulte a classe SecurityConfig deste aplicativo, mostrada no código a seguir:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${app.protect.authenticated}")
private String[] protectedRoutes;
private final AADB2COidcLoginConfigurer configurer;
public SecurityConfig(AADB2COidcLoginConfigurer configurer) {
this.configurer = configurer;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.authorizeRequests()
.antMatchers(protectedRoutes).authenticated() // limit these pages to authenticated users (default: /token_details)
.antMatchers("/**").permitAll() // allow all other routes.
.and()
.apply(configurer)
;
// @formatter:off
}
}
Mais informações
- Plataforma de identidade da Microsoft (Microsoft Entra ID para desenvolvedores)
- Visão geral da Biblioteca de autenticação da Microsoft (MSAL)
- Início rápido: registrar um aplicativo na plataforma de identidade da Microsoft
- Início Rápido: Configurar um aplicativo cliente para acessar APIs Web
- Noções básicas sobre as experiências de consentimento do aplicativo Microsoft Entra ID
- Entenda o consentimento do usuário e do administrador
- Objetos de entidade de serviço e aplicativo no Microsoft Entra ID
- Nuvens nacionais
- Exemplos de código do MSAL
- Biblioteca de cliente do Microsoft Entra ID Spring Boot Starter para Java
- Biblioteca de cliente do Azure Active Directory B2C Spring Boot Starter para Java
- Biblioteca de Autenticação da Microsoft para Java (MSAL4J)
- Wiki do MSAL4J
- Tokens de ID
- Tokens de acesso da plataforma de identidade da Microsoft
Para obter mais informações sobre como os protocolos OAuth 2.0 funcionam neste cenário e em outros cenários, consulte Cenários de autenticação para o Microsoft Entra ID.