Proteja suas APIs REST Spring Boot com Keycloak

Murilo Alves
10 min readJun 10, 2021

Keycloak — Resumo

A Keycloak é um produto open source da Red Hat, cuja versão enterprise é o Red Hat Single Sign-On, que permite o login único com o Gerenciamento de Identidades e Gerenciamento de Acesso, destinado a aplicativos e serviços modernos. Em vez de fazer login em aplicativos individuais, os usuários se autenticam no Keycloak.

O foco principal deste resumo completo é adicionar segurança a APIs REST Spring Boot com Keycloak Spring Boot Adapter.

Keycloak oferece alguns recursos como,

1. Suporte para OpenID Connect, OAuth 2.0 e SAML.

2. Single Sign-On

Suas aplicações não tem a necessidade de lidar com armazenamentos de usuários, armazenamento de credenciais, autenticação, formulários de login ou gerenciamento de sessão.

Com o recurso Single Sign-On, uma vez que um usuário faz login no Keycloak, os usuários não precisam fazer login novamente para acessar uma aplicação diferente e o mesmo se aplica ao logout.

3. Federação do usuário

Keycloak possui suporte integrado para conectar-se a servidores LDAP ou Active Directory existentes.

4. Provedores de identidade

O Keycloak pode autenticar usuários com provedores de identidade OpenID Connect ou SAML 2.0 configurando o mesmo por meio do console de administração. Além disso, sem código, seus aplicativos podem ser integrados a redes sociais como Facebook, Google, Microsoft, GitHub entre outros.

5. Serviços de autorização

Keycloak fornece autorização para gerenciar permissões para todos os serviços, usuários e grupos.

As funções podem ser definidas com o console de administração, bem como por meio de APIs, SDK.

Keycloak — Instalação

Existem algumas formas de se instalar o Keycloak. Neste artigo vou mostrar como instalar o Keycloak utilizando Docker.

Keycloak — Instalação com Docker

1. Garanta que tenha o Docker instalado em seu computador. Doc. Docker.

2. Abra seu Terminal e execute o seguinte comando. Substitua os campos <username>e <password>no comando abaixo, que será o nome de usuário e senha do administrador inicial.

docker run -p 8080:8080 -e KEYCLOAK_USER=<username> -e KEYCLOAK_PASSWORD=<password> quay.io/keycloak/keycloak:13.0.1

Existem várias variáveis ​​de ambiente disponíveis para configurações Keycloak adicionais, como integração com alguns bancos de dados (MySQL, PostgreSQL, MariaDB, Oracle, Microsoft SQL Server), Importar/Exportar Realms, Temas Personalizados, Provedores Personalizados, Clustering e muito mais.

Keycloak — Configuração

Criar Realm

Um Realm gerencia um conjunto de usuários, credenciais, funções e grupos. Um usuário pertence e efetua login em um domínio. Os realms são isolados uns dos outros e só podem gerenciar e autenticar os usuários que controlam.

1. Vá para http://localhost:8080/auth/admin/ e faça login no Keycloak Admin Console usando as credenciais de administrador que você adicionou ao executar o comando Docker no tópico anterior.

2. Clique menu suspenso Master localizado do lado esquerdo de sua tela e em seguida clique em Add Realm.

Quando você está conectado ao domínio master, este menu suspenso exibe todos os domínios existentes. Quando o domínio é criado, a página principal do console de administração é aberta. Observe que o domínio atual agora está definido como Demo, clique em Create.

Alterne entre o gerenciamento do domínio Master para o domínio que você acabou de criar, passe o mouse sobre o domínio Master,

E selecione o domínio Demo,

Certifique-se de que Demo está selecionado para as configurações abaixo. Evite usar o domínio Master. Você não precisa criar um Realm todas as vezes. É um processo único.

Criar Cliente

Os clientes são entidades que podem solicitar que o Keycloak autentique um usuário. Na maioria das vezes, os clientes são aplicativos e serviços que desejam usar o Keycloak para se proteger e fornecer uma solução de logon único.

Os clientes também podem ser entidades que desejam apenas solicitar informações de identidade ou um token de acesso para que possam invocar com segurança outros serviços na rede protegidos pelo Keycloak.

1. Clique no menu Clients no painel esquerdo. Todos os clientes disponíveis para o Realm selecionado (Demo) serão listados neste menu.

2. Para criar um novo cliente, clique em Create . Você será solicitado a fornecer um ID de cliente, um protocolo de cliente e uma URL raiz.

Uma boa escolha para o ID do cliente é o nome do seu aplicativo (demo-springboot-with-keycloak), o protocolo do cliente deve ser definido como openid-connecte o URL raiz deve ser definido como o URL da aplicação e como estamos testando localmente neste exemplo, vou adicionar a URL raiz como localhost.

3. Após de salvar o cliente, será exibida a página de configuração do mesmo, onde você pode atribuir um nome e uma descrição ao cliente, se desejar.

Defina o Access Type como confidential,

Authorization Enable para ON,

Service Accounts Enable para ON,

e clique em Save.

4. Clique na aba Credentials que mostrará o Client Secret que é necessário para as configurações do Spring Boot Application Keycloak.

Agora clique na aba Roles para criar as roles do cliente. Imagine que a aplicação com o qual você está construindo tenha diferentes tipos de usuários com diferentes permissões de usuário. Ex: usuários e administradores.

  • Algumas APIs só podem ser acessadas por usuários.
  • Algumas APIs podem ser acessadas apenas por administradores.
  • Algumas APIs podem ser acessadas por usuários e administradores.

Então, vamos criar duas roles: user e admin. Clique no botão add role localizado na lateral direita de sua tela,

Crie a role user,

Crie a Role admin,

Roles cadastradas,

Criar Roles de Realm

As aplicações geralmente atribuem acesso e permissões a roles específicas, em vez de usuários individuais, pois lidar com usuários pode ser muito trabalhoso e difícil de gerenciar.

Vamos criar app-user e app-admin Realm Roles atribuindo demo-springboot-with-keycloak roles correspondentes (user, admin).

  1. Clique no menu Roles no painel esquerdo. Todas as roles disponíveis para o Realm selecionado serão exibidas,

2. Para criar uma role app-user de role, clique em Add Role localizado na lateral direita de sua tela. Você será solicitado a fornecer um nome para a role e uma descrição . Forneça os detalhes abaixo e salve.

Após salvar, habilite Composite Roles para ON e pesquise por demo-springboot-with-keycloak no campo Client Roles.

Selecione a role user de demo-springboot-with-keycloak e clique em Add Selected>.

Esta configuração atribuirá a demo-springboot-with-keycloak a role user de cliente à role de app-user. Se você tiver vários clientes com várias funções, escolha as funções necessárias de cada cliente para criar funções de domínio com base na necessidade.

3. Realize os mesmos passos para criar o app-admin, mas atribua a role admin do cliente em vez da role user.

Criar Usuários

Vamos criar seguintes usuários e conceder-lhes app-user e app-admin para realizarmos os testes.

  • funcionario1 com app-user Realm Role.
  • funcionario2 com app-admin Realm Role.
  • funcionario3 com funções de app-user & app-admin Realm Roles.
  1. No menu, clique em Users para exibir a página da lista de usuários.

2. No lado direito da lista de usuários vazia, clique em Add User.

3. Informe o username; este é o único campo obrigatório.

3.1 Habilite o botão Email Verified de OFF para ON e clique em Save para salvar os dados e abrir a página de gerenciamento para o novo usuário.

4. Clique na aba Credentials para definir uma senha temporária para o novo usuário.

5. Digite uma nova senha e confirme-a. Mude o botão Temporary de ON para OFF e clique em Set Password para definir a senha do usuário para a nova que você informou. Para simplificar, vamos definir a senha mypassword para todos os usuários.

6. Clique na guia Role Mappings para atribuir Realm Roles ao usuário. A lista de roles do realm estará disponível na lista de Available Roles,

Selecione uma role necessária e clique em Add Selected> para atribuí-la ao usuário,

Acredito que tenha achado um pouco complicado passar por todas as configurações. Mas quando você começar a utilizar o Keycloak com mais frequência, essas configurações se tornarão muito simples.

Gerar Tokens

Agora vamos aprender como gerar um token de acesso para usuários do Keycloak.

  1. Vá para o menu Realm Settings do domínio Demo no menu à esquerda,

No campo Endpoints clique em OpenID Endpoint Configuration,

Para visualizar os detalhes do OpenID Endpoint,

2. Copie token_endpoint da OpenID Endpoint Configuration. A URL seria semelhante a:

<KEYCLOAK_SERVER_URL>/auth/realms/<REALM_NAME>/protocol/openid-connect/tokenEx: http://localhost:8080/auth/realms/Demo/protocol/openid-connect/token

3. Use o seguinte comando CURL para gerar as credenciais do usuário. Substituir KEYCLOAK_SERVER_URL, REALM_NAME, CLIENT_ID, CLIENT_SECRET, USERNAME, PASSWORD,

curl -X POST '<KEYCLOAK_SERVER_URL>/auth/realms/<REALM_NAME>/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=<CLIENT_ID>' \
--data-urlencode 'client_secret=<CLIENT_SECRET>' \
--data-urlencode 'username=<USERNAME>' \
--data-urlencode 'password=<PASSWORD>'

Exemplo,

curl -X POST 'http://localhost:8080/auth/realms/Demo/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=demo-springboot-with-keycloak' \
--data-urlencode 'client_secret=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
--data-urlencode 'username=funcionario1' \
--data-urlencode 'password=mypassword'

Caso tenha se esquecido, o client_secret se localiza no Menu Clients, após acessar este menu clique em demo-springboot-with-keycloak e vá até a aba Credentials, veja,

Secret

Execute o CURL do Terminal ou use o Postman. Veja a resposta da requisição feita no Postman,

Request,

Response,

Vamos decrypt o token access_token JWT emitido para que o funcionario1 possa utilizar. Clique aqui.

  • access_token contém os detalhes da permissão do usuário.
  • realm_access.roles contém app_user realm role.
  • resource_access.demo-springboot-with-keycloak.roles contém a user roles do cliente.
  • preferred_username contém o nome de usuário do usuário (funcionario1)

Veja o payload,

  • iat, exp,

Contém o tempo de emissão do token, bem como o tempo de expiração do mesmo. Os tempos de expiração do token de acesso podem ser personalizáveis ​​em Realm Settings,

Aba Tokens,

Por padrão, o Access Token Lifespan seria definido para 5 minutos, que pode ser personalizado com base em seus requisitos de segurança.

Na fase de teste da aplicação com Spring Boot, use as etapas acima para gerar tokens de acesso para vários usuários com as credenciais de usuário correspondentes. Além disso, se o token expirar, gere um novo token com o mesmo processo.

Clique aqui para continuar para a parte 2.

--

--