Configurando Strapi com Keycloak
Trabalhei em um projeto onde iniciamos ele utilizando o Strapi que é um Headless CMS, e sempre gostei dele por ele usar por trás o KOA que é um framework bem interessante.
Recentemente tive a oportunidade de voltar a usá-lo, e resolvi integrar o Keycloak e ver como seria essa integração.
Para quem não conhece o Keycloak é um software open source de gerenciamento de identidade.
Essa integração tem seus pontos de atenção, principalmente se você utiliza o Docker para suas aplicações, é bem difícil de encontrar um material atualizado, por isso resolvi escrever esse artigo.
Ambiente
Estou usando o Macbook com Docker, então pode ter alguns ajustes para outros sistemas operacionais, fiquem livres para fazer ajustes e melhorias de código.
- Docker;
- Keycloak 24;
- Strapi 4;
- Vite React;
- MySql 8;
- Postgres 12;
- Nginx;
O projeto que irei compartilhar está tudo junto com exceção da aplicação Frontend que no caso é a aplicação de exemplo da própria documentação do Strapi, eu só criei uma nova utilizando o React com Vite, pois estava com alguns erros.
Veja o vite.config.ts eu adicionei a chamada via o Proxy do Vite, para não ter erro de CORS.
Algumas breves explicações do porque o projeto está dessa forma:
No docker-compose.yml eu tenho os seguintes services:
- strapi-app: que é nosso Container que vai rodar o Strapi, já configurado com as variáveis de ambientes comuns do Strapi, e build aponta para nosso dockerfile.strapi que é a imagem para rodar em desenvolvimento. O único diferencial desse dockerfile.strapi são as linhas 9 - que adicionei o node-red, linha 12 - que adicionei NODE_TLS_REJECT_UNAUTHORIZED=0 e por fim linha 13 - que rodo o node-red, isso basicamente ignora os certificados assinados, precisamos disso pois nosso Keycloak está atrás de um Nginx com um certificado fake para desenvolvimento.
- strapi-db: que é o nosso banco de dados para o Strapi.
- strapi-keycloak: que é o nosso Keycloak;
- strapi-keycloak-db: que é nosso banco de dados para o Keycloak;
- strapi-nginx: que é o nosso Nginx, no build uso uma imagem do mkcert, para gerar os certificados, e temos o nginx.conf que é nossa configuração de servidor, para funcionar corretamente com https.
Ainda no docker-compose.yml temos nossa network externa para todos containers, um detalhe é que no strapi-app é necessário adicionar um extra_hosts para o Strapi enxergar o Keycloak.
Observação como nossa rede é externa é necessário criar via comando a rede, docker network create strapi-network.
Um outro detalhe é adicionar em nosso hosts os endereços corretos, como disse estou no mac então se eu digitar no terminal sudo vi /etc/hosts posso editar meus endereços e posso adicionar:
127.0.0.1 localhos.keycloak
Basicamente é isso não temos mais detalhes, claro que temos muito docker, então é bom ter um entendimento legal para saber o que fazer, e eu também não vou entrar em detalhes referente a cada linha de docker.
Na raiz do projeto rode os comandos yarn para poder instalar as dependências e docker compose up --build.
Observação: não esqueça do arquivo .env duplique o .env.example e preencha corretamente.
Se tudo correr bem, e todos os containers forem executados, podemos digitar:
https://localhost.keycloak/ para acessar nosso Keycloak local com https.
http://localhost:1337/admin/auth/login para acessar nosso Strapi.
Configuração Keycloak
Para acessar use admin / admin.
A configuração do Keycloak é simples vamos ter de criar nosso Realm e nosso Client.
Na criação do Relm é simples no caso eu criei um chamado strapi, e tem alguns detalhes que gosto de fazer:
- Na aba Login eu deixo assim:
- Na aba Themes eu deixo assim, adiciono um tema para os formulários, que já está no repositório:
- Na aba Localization deixo assim:
Fique livre para configurar como quiser, caso tenha mais conhecimentos do Keycloak.
Para criar o Client, também é bem simples, criei com o nome de app e ative o Client authentication e não preencha mais nada.
- Na aba Settings coloque esses endereços:
- Na aba Credentials iremos precisar apenas copiar o Client Secret para colocar no Strapi que vamos fazer nos próximos passos.
Se você já fez tudo isso finalizamos com o Keycloak.
Configuração Strapi
Após o primeiro acesso e todo cadastro de usuário, você verá a tela de login:
Para configurar o Strapi é tudo muito simples também, vá em Settings -> Providers no meu caso eu desabilitei o padrão que é de Email, e ativei o Keycloak com essas configurações:
São configurações simples, todos endereços que geramos via docker, e se tudo estiver funcionando não terá problemas, ali em Client Secret cole o Secret Key que citamos acima.
O campo Host URI foi o que deu mais trabalho, pois não podemos usar o protocolo e ele sempre aponta para o https, por isso toda a questão de usar um Nginx e as configurações mais complexas de certificados.
Tudo funcionando =)
Com tudo rodando e configurado o resultado tem de ser esse:
Pronto temos um Strapi integrado ao Keycloak, agora é possível utilizar todos poderes do Keycloak.
Repositórios:
Strapi completo: https://github.com/alcir-junior-caju/study-ts-strapi-keycloak
React (Vite) com a aplicação simples de login: https://github.com/alcir-junior-caju/study-ts-strapi-login-with-keycloak
Comments ()