Este projeto implementa um user storage para busca de usuários em um banco de dados com o Keycloak.
A documentação sobre como implementar um user storage está nesta página.
O primeiro passo é gerar o pacote do projeto:
mvn clean package
Além do artefato padrão, será gerado um artefato na pasta ./.docker/providers.
Na raiz do projeto há uma pasta chamada .docker, a qual contém um docker-compose que inicializa um container do Keycloak e um do MySQL.
A configuração do Keycloak no docker-compose usa o MySQL para armazenamento dos dados, e mapeia a pasta providers no diretório onde o Keycloak reconhece e instala os providers.
Para o Keycloak são configurados um realm (conceito do Keycloak equivalente a um tenant) chamado Provider, um client chamado provider, e o user federation que utiliza nosso artefato para buscar os usuários no banco de dados.
Para o MySQL é configurada uma base chamada keycloak, com alguns usuários pré-cadastrados.
Depois de gerado o pacote, basta iniciar o docker-compose:
docker-compose up -d
A inicialização leva um tempo, então é legal verificar os logs para ver quando tudo estiver pronto:
docker-compose logs -f keycloak
A inicialização estará completa quando um log como o abaixo for exibido:
INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
O painel administrativo do Keycloak pode ser acessado no endereço abaixo:
Ná pagina, clicar em Administration Console e utilizar como usuário: admin e senha: admin
No diretório .postman existe uma coleção do Postman. Basta importá-la e executar a request. Também é possível obter um token com o comando curl abaixo:
curl --location --request POST 'http://localhost:8050/auth/realms/Provider/protocol/openid-connect/token' \
--header 'Authorization: Basic cHJvdmlkZXI6NDMwNDFiZTctZDYxZC00OWQwLWJjZmYtODZhN2MyY2E2ZjAw' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=[email protected]' \
--data-urlencode 'password=123' \
--data-urlencode 'client_id=provider'