# Discourse, Keycloak, SAML - é impossível configurar?

**URL:** https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333
**Category:** SSO
**Created:** [Setembro 25, 2020, 8:01am UTC](https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333 "2020-09-25T08:01:26Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [Setembro 25, 2020, 8:01am UTC](https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333/1 "2020-09-25T08:01:27Z")

</div>

Olá!  
Já estou fazendo isso há quase uma semana, mas não consigo configurá-lo! Já tentei um milhão de opções! Por favor, me ajude…

Então, há uma instância de teste do Keycloak, endereço - `http://10.5.40.19:8081`. Lá criei um realm `CUBA` e um cliente SAML:

 ![image](https://global.discourse-cdn.com/meta/original/3X/6/e/6eafc0586a96053ce9b21c7e81896626edcca089.png)  
 ![image](https://global.discourse-cdn.com/meta/original/3X/6/3/631f8170a3b38ccc7a5d2e8f1c2050b4ef44946b.png)

Como você pode ver nas capturas de tela, há um fórum de teste do Discourse em `https://cuba-test-forum-en.demo.haulmont.com/discuss`  
De acordo com a documentação do plugin discourse-saml, a URL para conexão com SSO no meu fórum de teste será assim - `https://cuba-test-forum-en.demo.haulmont.com/discuss/auth/saml/callback`

> **[GitHub - discourse/discourse-saml: Support for SAML in Discourse](https://github.com/discourse/discourse-saml)**
>
> Support for SAML in Discourse

Configurações SAML no arquivo `app.yml`:

```plaintext
DISCOURSE_RELATIVE_URL_ROOT: /discuss

DISCOURSE_SAML_TITLE: "Exemplo SAML"
DISCOURSE_SAML_TARGET_URL: "http://10.5.40.19:8081/auth/realms/CUBA/protocol/saml"
DISCOURSE_SAML_AUTO_CREATE_ACCOUNT: 1
DISCOURSE_SAML_CERT_FINGERPRINT: "0D:9A:46:68:6B:CA:A6:41:7A:F5:08:18:C4:01:47:33:75:AD:2C:EF"
DISCOURSE_SAML_CERT: "-----BEGIN CERTIFICATE-----
MIICmzCCAYMCBgF0wEV2uzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZlbnNhbWwwHhcNMjAwOTI0MTMxODMxWhcNMzAwOTI0MTMyMDExWjARMQ8wDQYDVQQDDAZlbnNhbWwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCclA1o6Q3jcpqpxHtx79nrDCBfUIHUhZP+4+wLlV+7nel7Kts5Tas6jSToeptueWxRLKadWtV5hN3ommGAN5/u61UXP1JX6c/vTkZZgS+xBO5wekCjZVnbOL2NA6n0PVq7//zinaqP6KsiUo8xKJKe1mrehVVpCUQW4a9rqzj8mTwE3t5t+X5GidvYDdqH075q47uTqO5WbiDJGPNH3qT8g07bzt5y3hTtu1aohCkAiChognRxVb1WDn35oC7Tn/1Hckbxie18tREXOha35Dq2jWAS5CyLf1pTHURpWS7JMp6cu8ZHE39hJpo6MKHkhtQgd9I6DBDoP1gTShU6eFCTAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAAfJQNOygoL+Z16iLg8bA8l81Q/5VTmMFu2EKadefkHU611tZZm9D+5gug5RRHsaQn/NoL9gz1gDoUhBLgptklFHmiIIhGQmKdFeoNi5twIb6LFMe4ZhukWVlZuAfEHge0iE9M6/wQ54FYgQQ2aZjK+RnxBEaCRTxzJ/FzAjB/4Fp4DC2xQ8ceFdvnQoc8I+4K5SHIVqJdwKe44xIKLaLU/xKQcVeAe5drXPGOoDn4uBcrlDl6RstIIgkyIlp4RM0ofxOdUVj7PUo9NsxS9Zl9+MbHsydXTN8GhQFSoLW0zaXNFfAT0d7JJCR0QZAd9iP6YCJYBz3y5KjEeIREUUfTM=
-----END CERTIFICATE-----"

```

Peguei o certificado daqui:

 ![image](https://global.discourse-cdn.com/meta/original/3X/7/4/7487ddbec4638de45fdec64312e5fdde124efb89.png)

Exportei para PKCS12:

 ![image](https://global.discourse-cdn.com/meta/original/3X/4/5/4539c4e11c26699e039122b3ca9c29ebe89fd525.png)

Importei para o KeyChain do meu MacBook e exportei para PEM. Na verdade, ficou igual, apenas com as palavras “BEGIN …” no início e “END …” no final.

Quando tento fazer login usando SAML, ele me redireciona para a página do Keycloak:

 ![image](https://global.discourse-cdn.com/meta/original/3X/e/e/eeb5baabeaab383e83cbf4320aeff4795155ec74.png)

Mas lá vejo um erro:

 ![image](https://global.discourse-cdn.com/meta/original/3X/1/7/17169230d18b22f02250cf947d6e74afae272cce.png)

O que estou fazendo de errado? Configurei a autorização OpenID, funciona. Mas! Por várias razões, preciso fornecer SAML também.  
Peço muito ajuda!

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [Setembro 25, 2020, 8:23am UTC](https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333/2 "2020-09-25T08:23:15Z")

</div>

O servidor Keycloak está em um IP privado. Esse IP é acessível de onde precisa ser acessado?

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [Setembro 25, 2020, 8:33am UTC](https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333/3 "2020-09-25T08:33:52Z")

</div>

Claro! Caso contrário, eu não teria sido redirecionado para a página do Keycloak:

 ![image](https://global.discourse-cdn.com/meta/original/3X/9/4/94cd9861bdb885b14bfa2dcafd329c07f720d914.jpeg)

Ping:

 ![image](https://global.discourse-cdn.com/meta/original/3X/e/e/ee0972bbe2458cc84e12b05326b6ca856351c2c1.png)

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [Setembro 25, 2020, 10:24am UTC](https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333/4 "2020-09-25T10:24:46Z")

</div>

Vou adicionar. O Keycloak está sendo executado em um contêiner Docker. Aqui está o log desse contêiner ao alternar para SAML a partir do Discourse:

```plaintext
10:21:53,379 WARN [org.keycloak.events] (default task-198) type=LOGIN_ERROR, realmId=CUBA, clientId=https://cuba-test-forum-en.demo.haulmont.com/discuss, userId=null, ipAddress=172.27.0.1, error=client_not_found

```

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [Setembro 25, 2020, 11:28am UTC](https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333/5 "2020-09-25T11:28:48Z")

</div>

Alterei o ClientID no Keycloak para o definido nos logs:

 ![key07](https://global.discourse-cdn.com/meta/original/3X/e/b/eb82895a22e6d8d21abac092d8d1a431680e7fed.png)

Agora, nos logs do Keycloak, aparece este erro:

```plaintext

11:24:32,750 ERROR [org.keycloak.protocol.saml.SamlService] (default task-211) validação da solicitação falhou: org.keycloak.common.VerificationException: SigAlg estava nulo

	at org.keycloak.keycloak-services@11.0.2//org.keycloak.protocol.saml.SamlProtocolUtils.verifyRedirectSignature(SamlProtocolUtils.java:137)

	at org.keycloak.keycloak-services@11.0.2//org.keycloak.protocol.saml.SamlProtocolUtils.verifyRedirectSignature(SamlProtocolUtils.java:127)

	at org.keycloak.keycloak-services@11.0.2//org.keycloak.protocol.saml.SamlService$RedirectBindingProtocol.verifySignature(SamlService.java:592)

	at org.keycloak.keycloak-services@11.0.2//org.keycloak.protocol.saml.SamlService$BindingProtocol.handleSamlRequest(SamlService.java:268)

	at org.keycloak.keycloak-services@11.0.2//org.keycloak.protocol.saml.SamlService$BindingProtocol.execute(SamlService.java:537)

	at org.keycloak.keycloak-services@11.0.2//org.keycloak.protocol.saml.SamlService.redirectBinding(SamlService.java:635)

	at jdk.internal.reflect.GeneratedMethodAccessor940.invoke(Unknown Source)

	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

	at java.base/java.lang.reflect.Method.invoke(Method.java:566)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:138)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:543)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:432)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:393)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:395)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:364)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:150)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:104)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:440)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:229)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:135)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:138)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:215)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:245)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:61)

	at org.jboss.resteasy.resteasy-jaxrs@3.12.1.Final//org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)

	at javax.servlet.api@2.0.0.Final//javax.servlet.http.HttpServlet.service(HttpServlet.java:590)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)

	at org.keycloak.keycloak-wildfly-extensions@11.0.2//org.keycloak.provider.wildfly.WildFlyRequestFilter.lambda$doFilter$0(WildFlyRequestFilter.java:41)

	at org.keycloak.keycloak-services@11.0.2//org.keycloak.services.filters.AbstractRequestFilter.filter(AbstractRequestFilter.java:43)

	at org.keycloak.keycloak-wildfly-extensions@11.0.2//org.keycloak.provider.wildfly.WildFlyRequestFilter.doFilter(WildFlyRequestFilter.java:39)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)

	at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)

	at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)

	at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

	at io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)

	at io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)

	at io.undertow.core@2.1.3.Final//io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)

	at io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)

	at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

	at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)

	at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

	at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)

	at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)

	at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)

	at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)

	at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)

	at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)

	at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)

	at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)

	at io.undertow.core@2.1.3.Final//io.undertow.server.Connectors.executeRootHandler(Connectors.java:370)

	at io.undertow.core@2.1.3.Final//io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)

	at org.jboss.threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)

	at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)

	at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)

	at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)

	at java.base/java.lang.Thread.run(Thread.java:834)

11:24:32,750 WARN [org.keycloak.events] (default task-211) type=LOGIN_ERROR, realmId=CUBA, clientId=null, userId=null, ipAddress=172.27.0.1, error=invalid_signature

```

---

<div class="post-metadata">

### Author: ![IT-Sumpfling](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/it-sumpfling/32/197353_2.png) [@IT-Sumpfling](https://meta.discourse.org/u/IT-Sumpfling)
#### Post date: [Outubro 18, 2020, 7:54am UTC](https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333/6 "2020-10-18T07:54:39Z")

</div>

Seu último erro mostra que o Keycloak exige que as solicitações SAML sejam assinadas.  
Portanto, você precisa configurar:

- `DISCOURSE_SAML_SP_CERTIFICATE`: Certificado do Provedor de Serviços (SP) SAML
- `DISCOURSE_SAML_SP_PRIVATE_KEY`: Chave privada do Provedor de Serviços (SP) SAML
- `DISCOURSE_SAML_AUTHN_REQUESTS_SIGNED`: padrão é false
- `DISCOURSE_SAML_WANT_ASSERTIONS_SIGNED`: padrão é false
- `DISCOURSE_SAML_LOGOUT_REQUESTS_SIGNED`: padrão é false
- `DISCOURSE_SAML_LOGOUT_RESPONSES_SIGNED`: padrão é false

(você precisará de um certificado com uma chave privada para o Discourse (o SP) para isso).

Ou você pode desativar a configuração relacionada a solicitações assinadas no Keycloak (não conheço o Keycloak, mas pela sua captura de tela, acho que desativar “Assinatura do cliente necessária” deve resolver…)  
Cuidado: desativar a assinatura de solicitações do cliente tem certas implicações de segurança (ou seja, outras partes poderiam assinar em nome do(s) seu(s) usuário(s) - se não me engano). É melhor pesquisar sobre isso e não confiar apenas em mim 😉

---

<div class="post-metadata">

### Author: ![greenback](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/greenback/32/198835_2.png) [@greenback](https://meta.discourse.org/u/greenback)
#### Post date: [Novembro 2, 2020, 3:11pm UTC](https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333/7 "2020-11-02T15:11:59Z")

</div>

Olá @nahimov,  
Isso ajudou? Você conseguiu configurar o Discourse + Keycloak SAML?  
Você poderia compartilhar sua experiência?  
Obrigado desde já!

---

<div class="post-metadata">

### Author: ![bgmatcher](https://avatars.discourse-cdn.com/v4/letter/b/dbc845/32.png) [@bgmatcher](https://meta.discourse.org/u/bgmatcher)
#### Post date: [Março 16, 2021, 7:00pm UTC](https://meta.discourse.org/t/discourse-keycloak-saml-is-it-impossible-to-configure/165333/8 "2021-03-16T19:00:27Z")

</div>

Vejo tantas perguntas sobre Discourse + Keycloak.

Esta aqui ( [Keycloak with Discourse - #20 by mahcr](https://meta.discourse.org/t/keycloak-with-discourse/63139/21) ) tem 5,2 mil visualizações.

Talvez já fosse o bastante para alguém escrever um guia passo a passo de como configurá-lo.

Eu, por exemplo, agradeceria muito, muito mesmo.
