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.
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:
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:
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.
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
Software Engineer 🤠
1yHey Alcir thanks for this! With this setup, can i use the access token generated from keycloak to access strapi endpoints? I use nextauth with keycloak and strapi, still haven't dont this configuration (because i have a different setup already) but i have a issue that strapi is not aware of the keycloak/nextauth token.
Analyste développeur
1yHi, i tried, but it doesnt work... as far as I can see, the only difference is that you've rewritten the HOST URI. To get around this, I just do a manual action by removing the S, I connect to Keycloak, and it redirects me to the front, but without the access token. I don't know what I forgot.