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:

https://www.youtube.com/watch?v=t4-416mg6iU

https://www.youtube.com/watch?v=3pZ3Nh8tgTE
Sobre os diferentes tipos de Flows do OAuth

Outro tutorial interessante, explicando o OAuth e também o OpenID Connect

https://www.youtube.com/watch?v=t18YB3xDfXI
OAuth e 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://ordina-jworks.github.io/security/2019/08/22/Securing-Web-Applications-With-Keycloak.html#implicit-flow-versus-code-flow--pkce

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