Keycloak - Mão na massa
Instale o KeyCloak no docker
Documentação
https://hub.docker.com/r/jboss/keycloak
docker run -d -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e DB_VENDOR=h2 -p 8889:8080 jboss/keycloak
O Keycloak implementa o OpenID Connect (ou OIDC), que por sua vez implementa o OAuth 2.0 framework. O OIDC vai além do OAuth 2.0, pois ele também é um
Para usar o Keycloak no modo OpenID Connect, você precisa entender o OAuth 2.0. Esses 3 vídeos sensacionais te ensinam:
Outro tutorial interessante, explicando o OAuth e também o OpenID Connect
Crie um novo realm, já que o realm master é interno do próprio keycloak.
Entre OpenID Endpoint Configuration
Lá, copie o link que termina com /openid-connect/auth
http://localhost:8889/auth/realms/app/protocol/openid-connect/auth
Existem vários tipos de Flows do OAuth2
Flow n. 1 - Authorization Code Flow
É usada na comunicação entre:
Backend - Backend
Ambos os backends têm uma chave secreta compartilhada chamada Client Secret, e usam ela em todas as comunicações, e é por isso que este modo não é recomendado para SPAs.
É usada quando um aplicativo terceiro quer acessar seus documentos no Google Drive, por exemplo. Há uma relação entre 4 pessoas:
Usuário (Resource Owner)
Servidor da aplicação (Client) (Aplicativo terceiro)
Servidor de autenticação (Authorization Server, o Keycloak)
Servidor que detém o recurso (Resource Server) (Google Drive)
Client access type: Confidential?
Flow n. 2 - Implicit Flow
É usada na comunicação:
Frontend - Backend
Backend - Backend
É usada quando um SPA pede um Token diretamente ao servidor de autenticação/autorização.
Client access type: Public
Flow n. 3 - Client Credentials Flow
É usada na comunicação:
Backend - Backend
É usada para autenticação entre microserviços que você confia.
Client access type: Bearer-only?
Flow n.4 - Authorization Code with PKCE Flow
Use esse flow para usar em SPAs (React, Angular e AngularJS)!
Esse flow veio para substituir a Implicit Flow.
https://stackoverflow.com/questions/57650692/where-to-store-the-refresh-token-on-the-client
Artigos sobre usando PKCE Flow + Keycloak
https://ordina-jworks.github.io/security/2019/08/22/Securing-Web-Applications-With-Keycloak.html
https://www.janua.fr/pkce-support-with-keycloak-7-0/
Artigos sobre o PKCE flow
https://developer.okta.com/blog/2019/08/22/okta-authjs-pkce#use-pkce-to-make-your-apps-more-secure
https://developer.okta.com/blog/2019/05/01/is-the-oauth-implicit-flow-dead
https://developer.pagerduty.com/docs/app-integration-development/oauth-2-pkce/
Referências
Pegando um Token de Acesso do Keycloak com Postman
https://dzone.com/articles/get-access-token-from-keycloak-using-postman
Biblioteca Client OpenID Connect em Javascript (é a recomendada pelo OpenID)
https://github.com/IdentityModel/oidc-client-js/
Bibliotecla Client do OpenID Connect em Javascript
https://github.com/openid/AppAuth-JS
Wrapper React em cima do OIDC-Client-JS
https://github.com/bsvveen/React-OpenIdConnect
Bibliotecas OpenID Connect Certificadas
https://openid.net/developers/certified/
Explicando tipo Bearer Only
https://stackoverflow.com/questions/58911507/keycloak-bearer-only-clients-why-do-they-exist
React Keycloak
https://medium.com/scalac/user-authentication-with-keycloak-part-1-35295107acd
Referências - Multi Tenancy no Keycloak
O Keycloak não suporta nativamente um esquema multi tenancy escalável. A solução que os desenvolvedores oficiais dão é de um realm por tenant, mas após 400 realms serem criadas, a performance do Keycloak começa a desandar.
Alguns hacks são propostos pela comunidade, aqui vão algumas discussões encontradas sobre o assunto:
https://keycloak.discourse.group/t/supporting-multi-tenancy-with-keycloak/1492
https://stackoverflow.com/questions/55641667/emulating-tenants-using-roles
https://github.com/keycloak/keycloak/tree/master/examples/multi-tenant
https://keycloak.discourse.group/t/multi-tenancy-realm-resolution-based-on-username-email-address/4155
https://medium.com/swlh/using-keycloak-for-multi-tenancy-with-one-realm-7be81583ed7b
https://stackoverflow.com/questions/56684168/can-multi-tenancy-in-keycloak-be-done-within-a-single-realm
Referências - Onde guardar o token em um cliente inseguro (SPA, Android, IOS)
https://stackoverflow.com/questions/57650692/where-to-store-the-refresh-token-on-the-client
Referências - React + Keycloak + PKCE
https://stackoverflow.com/questions/56934483/react-spa-with-oidc-pkce-and-identityserver-io
https://medium.com/swlh/modern-oauth-for-single-page-applications-using-pkce-e1cdd2f1b84
https://developer.okta.com/blog/2019/08/22/okta-authjs-pkce
https://www.npmjs.com/package/react-pkce
https://www.npmjs.com/package/react-oauth2-pkce
Keycloak JS official:
https://www.npmjs.com/package/keycloak-js
Keycloak JS React Wrapper (unnoficial, but the only one):
https://www.npmjs.com/package/@react-keycloak/web
https://github.com/react-keycloak/react-keycloak
https://cagline.medium.com/authenticate-and-authorize-react-routes-component-with-keycloak-666e85662636