# Usar Discourse como provedor de identidade (SSO, DiscourseConnect)

**URL:** https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974
**Category:** Integrations
**Tags:** sso, discourseconnect, how-to
**Created:** [Setembro 7, 2015, 9:19am UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974 "2015-09-07T09:19:21Z")
**Posts on this page:** 20
**Page:** 6

<div class="post-metadata">

### Author: ![paulrbr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/paulrbr/32/190056_2.png) [@paulrbr](https://meta.discourse.org/u/paulrbr)
#### Post date: [Setembro 29, 2020, 10:03pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/105 "2020-09-29T22:03:45Z")

</div>

Olá 👋, escrevi este módulo de autenticação SimpleSAMLphp para permitir o uso do Discourse como provedor de SSO em uma instalação do SimpleSAMLphp. Ou seja, você pode usar o Discourse como provedor de SSO para qualquer serviço que suporte autenticação SAML ou Shibboleth, o que é realmente ótimo.

> **[GitHub - swcc/simplesamlphp-module-authdiscourse](https://github.com/swcc/simplesamlphp-module-authdiscourse)**
>
> Contribute to swcc/simplesamlphp-module-authdiscourse development by creating an account on GitHub.

Me diga o que você acha (se tiver interesse em comentar sobre o código, pode usar as Issues do GitHub).

---

<div class="post-metadata">

### Author: ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)
#### Post date: [Setembro 29, 2020, 11:33pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/106 "2020-09-29T23:33:10Z")

</div>

Isso é ótimo! Se quiser tornar o módulo mais visível, você pode criar um tópico sobre ele na nossa categoria #Customization > Extras. Essa categoria é um diretório de todas as extensões e integrações para o Discourse que não são plugins do Discourse.

---

<div class="post-metadata">

### Author: ![Richie](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/richie/32/115110_2.png) [@Richie](https://meta.discourse.org/u/Richie)
#### Post date: [Outubro 1, 2020, 7:22pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/107 "2020-10-01T19:22:19Z")

</div>

EDIT: Imagem de mockup adicionada

* * *

Estou implementando este SSO em um site existente e gostaria apenas de verificar como as pessoas estão “apresentando” seu método de login aos usuários.

Por exemplo, digamos que meu site em [www.example.com](http://www.example.com) tenha um botão de Login na barra de navegação superior.

Esse botão de login deve levar as pessoas diretamente para a página de autenticação do meu Discourse? Ou é preferível exibir primeiro uma página ou modal com informações, algo como:

 ![Screen Shot 2020-10-01 at 21.31.58](https://global.discourse-cdn.com/meta/original/3X/b/e/be9d0c11492bba079d5f1ffa002d115841fb720b.png)

Estou apenas me perguntando se as pessoas ficarão confusas se _não_ forem informadas sobre o que vai acontecer? 🤔

Alguém tem alguma experiência de usuário ou melhores práticas para compartilhar?

E obrigado também, aliás, ao @techAPJ pelo primeiro post muito detalhado neste tópico; consegui construir isso do zero no meu site [ASP.NET](http://ASP.NET) seguindo seus passos 👍🏻

---

<div class="post-metadata">

### Author: ![jessicah](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jessicah/32/102653_2.png) [@jessicah](https://meta.discourse.org/u/jessicah)
#### Post date: [Outubro 2, 2020, 12:02pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/108 "2020-10-02T12:02:03Z")

</div>

É possível incluir um parâmetro de estado que seja retornado inalterado, como é feito no OAuth? O middleware de autenticação do [ASP.NET](http://ASP.NET) Core depende da geração de um ID de correlação para prevenir ataques CSRF, e atualmente não tenho uma maneira fácil de incluí-lo.

---

<div class="post-metadata">

### Author: ![Richie](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/richie/32/115110_2.png) [@Richie](https://meta.discourse.org/u/Richie)
#### Post date: [Outubro 4, 2020, 11:55am UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/109 "2020-10-04T11:55:26Z")

</div>

> [@jessicah](#):
>
> É possível incluir um parâmetro de estado que seja retornado sem alterações?

Você não poderia adicionar um à string de consulta da sua URL de callback antes de finalizá-la?

Ex:

`nonce=NONCE&return_sso_url=https://www.example.com/my/callback_url.aspx?myparam=here`

---

<div class="post-metadata">

### Author: ![Richie](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/richie/32/115110_2.png) [@Richie](https://meta.discourse.org/u/Richie)
#### Post date: [Outubro 10, 2020, 7:45pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/110 "2020-10-10T19:45:04Z")

</div>

@jessicah Eu testei isso hoje e, sim, funciona perfeitamente.

```plaintext
        ' Criar uma URL de retorno
        Dim strReturnURL As String = "https://www.example.com/authtestRETURNURL.aspx?myownparametershere=surewhynot"

        ' Gerar um nonce aleatório. Salve-o temporariamente para que você possa verificá-lo com o valor do nonce retornado
        Dim strNonce As String = Guid.NewGuid().ToString("N")

        ' Criar um novo payload com o nonce e a URL de retorno (para onde o Discourse redirecionará o usuário após a verificação)
        ' O payload deve se parecer com: nonce=NONCE&return_sso_url=RETURN_URL
        Dim strPayload As String = "nonce=" & strNonce & "&return_sso_url=" & strReturnURL

```

Então, na página que é chamada de volta, você encontrará isso dentro da sua string de consulta SSO decodificada:

```plaintext
&return_sso_url=http%3A%2F%2Fwww.example.com%2FauthtestRETURNURL.aspx%3Fmyownparametershere%3Dsurewhynot&username=Rich
```

Espero que seja isso que você quis dizer?

---

<div class="post-metadata">

### Author: ![camkego](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/camkego/32/166120_2.png) [@camkego](https://meta.discourse.org/u/camkego)
#### Post date: [Dezembro 29, 2020, 6:17pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/111 "2020-12-29T18:17:13Z")

</div>

**Abordagens multi-site** para uso do discourse-auth-proxy?

Existem exemplos ou recomendações para usar o Discourse como provedor de SSO para autenticação multi-site?

Parece que existem duas abordagens básicas para multi-site:

1. Usar múltiplas instâncias do _discourse-auth-proxy_, uma por site protegido.
2. Usar uma única instância do _discourse-auth-proxy_ para que o payload contendo o `return_sso_url` mude com base na origem da solicitação de login.

Acho que qualquer uma dessas poderia funcionar, mas o problema com essas duas abordagens é que você ainda precisa fazer login em cada site diferente.  
Há também o risco de que algo seja armazenado no Postgres e seja sobrescrito por cada login dos diferentes sites. Ou seja: [site1.com](http://site1.com), [site2.com](http://site2.com)  
(Não conheço os detalhes do esquema de autenticação do Discourse/PG, então não sei)

O que seria ideal é uma maneira de realizar o login uma única vez, o que faria com que você estivesse logado em todos os sites do grupo multi-site. Ou seja: [site1.com](http://site1.com), [site2.com](http://site2.com), [site3.com](http://site3.com)

Aparentemente, o Stackoverflow faz isso usando uma combinação de armazenamento local (`localStorage`) e `iframes` como principais facilitadores. [descrição técnica](https://meta.stackexchange.com/a/64274/247609)

Mas eu adoraria saber se alguém implementou alguma abordagem para login multi-site usando o Discourse como provedor de SSO.

Abordagem 1: múltiplas instâncias do discourse-auth-proxy  
Abordagem 2: discourse-auth-proxy modificado alterando o `return_sso_url` no payload.  
Abordagem 3: #1 ou #2 implementadas de forma que, ao fazer login uma vez, você não precise fazer login novamente ao migrar de [site1.com](http://site1.com) para [site2.com](http://site2.com)

Estou marcando você, @sam, já que você foi o autor original do programa Go discourse-auth-proxy.

---

<div class="post-metadata">

### Author: ![hawm](https://avatars.discourse-cdn.com/v4/letter/h/f07891/32.png) [@hawm](https://meta.discourse.org/u/hawm)
#### Post date: [Abril 21, 2021, 2:29pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/113 "2021-04-21T14:29:12Z")

</div>

Olá.

Estou travado em como o provedor lida com o sinal `+` na URL de retorno do SSO.

No meu caso, meu consumidor [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) cria uma `return_sso_url` como:

1. `http://example.com/foo/bar?wpLoginToken=123+\` (bruto)
2. `http%3A%2F%2Fexample.com%2Ffoo%2Fbar%3FwpLoginToken%3D123%2B%5C` (codificada via PHP)

Em seguida, o [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) retorna para:

1. `http://example.com/foo/bar?wpLoginToken=123%20\&sso=foo&sig=bar`
2. `http://example.com/foo/bar?wpLoginToken=123+\&sso=foo&sig=bar`

O problema é que a URL de retorno será processada pela função `urldecode` no PHP (que é o fluxo principal de autenticação do MediaWiki), e o valor de `wpLoginToken` mudará inesperadamente de `123+\` para `123 \`.

Parece que encontrei a causa:

> **[Public Class Methods - Module: URI (Ruby 2.7.1)](https://ruby-doc.org/stdlib-2.7.1/libdoc/uri/rdoc/URI.html#method-c-decode_www_form)**
>
> Decodes URL-encoded form data from given str. | Module : URI - Ruby 2.7.1

> **[PHP: urlencode - Manual](https://www.php.net/manual/en/function.urlencode.php)**
>
> URL-encodes string

Bem, o cliente e o servidor implementam codificação/decodificação, mas seguem especificações diferentes.

Não estou pedindo ao Discourse que altere nada, mas procurando conselhos para resolver isso.

Obrigado.

Edição:  
Resolvi apenas codificando o sinal `+` duas vezes.

---

<div class="post-metadata">

### Author: ![uckelman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/uckelman/32/103854_2.png) [@uckelman](https://meta.discourse.org/u/uckelman)
#### Post date: [Julho 9, 2021, 11:28pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/114 "2021-07-09T23:28:08Z")

</div>

> [@mdoggydog](#):
>
> Por favor, experimente isso:
> 
> [https://github.com/mdoggydog/DiscourseSsoConsumer](https://github.com/mdoggydog/DiscourseSsoConsumer)

Obrigado!

Estou testando isso agora. Enviei dois PRs para você no GitHub: um para atualizar a documentação e outro para corrigir um bug que encontrei.

---

<div class="post-metadata">

### Author: ![uckelman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/uckelman/32/103854_2.png) [@uckelman](https://meta.discourse.org/u/uckelman)
#### Post date: [Julho 15, 2021, 11:09pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/115 "2021-07-15T23:09:58Z")

</div>

Em `Configurações > Login`, as duas configurações do _provedor_ do [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) não estão consecutivas e aparecem intercaladas com as configurações do [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true):

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

Como as configurações do provedor e as não provedoras são para casos de uso opostos — usar o Discourse para gerenciar usuários de outra coisa versus usar outra coisa para gerenciar usuários do Discourse — exibir essas configurações misturadas pode levar a uma configuração incorreta. Seria menos confuso se as duas configurações do provedor estivessem consecutivas e totalmente antes ou totalmente depois das configurações não provedoras.

---

<div class="post-metadata">

### Author: ![hyd504](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hyd504/32/177122_2.png) [@hyd504](https://meta.discourse.org/u/hyd504)
#### Post date: [Agosto 8, 2021, 1:55am UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/116 "2021-08-08T01:55:54Z")

</div>

@techAPJ Isso pode ser usado com o AWS Cognito? Quero criar um aplicativo no AWS Amplify para minha comunidade Discourse e gostaria que o aplicativo fosse autenticado através do Discourse.

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [Outubro 26, 2021, 9:35am UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/118 "2021-10-26T09:35:20Z")

</div>

> [@uckelman](#):
>
> Em `Configurações > Login`, as duas configurações de _provedor_ do [DiscourseConnect](https://meta.discourse.org/t/13045) não estão consecutivas e aparecem intercaladas com as configurações do [DiscourseConnect](https://meta.discourse.org/t/13045):

Desculpe pela resposta tão atrasada. Você tem toda a razão — é confuso que elas estejam intercaladas assim. Eu organizei isso neste PR:

> <https://github.com/discourse/discourse/pull/14716>
>
> This commit groups \`auth\_overrides\_\*\`, \`discourse\_connect\_\*\` and \`discourse\_conn…ect\_provider\_\*\` settings separately, rather than interspersing them.
> 
> There will be no functional change. This only affects the order in which they're shown in the admin panel

---

<div class="post-metadata">

### Author: ![uckelman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/uckelman/32/103854_2.png) [@uckelman](https://meta.discourse.org/u/uckelman)
#### Post date: [Novembro 25, 2021, 12:49pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/119 "2021-11-25T12:49:11Z")

</div>

@mdoggydog Obrigado pela atualização recente da extensão MediaWiki DiscourseSsoConsumer. Estávamos quebrando a cabeça sobre o que fazer em relação aos usuários sendo desconectados de nossa wiki sem terem se desconectado do Discourse, e `$wgPluggableAuth_EnableAutoLogin` definitivamente não era o que queríamos, pois impede o acesso anônimo à wiki. A configuração `$wgDiscourseSsoConsumer_AutoRelogin` que você adicionou é _exatamente_ o que precisávamos.

---

<div class="post-metadata">

### Author: ![cookieman768](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cookieman768/32/118511_2.png) [@cookieman768](https://meta.discourse.org/u/cookieman768)
#### Post date: [Janeiro 1, 2022, 4:21am UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/120 "2022-01-01T04:21:07Z")

</div>

Olá 👋!

Estou tentando usar o exemplo de PHP da postagem original, mas a forma como eles estão armazenando as coisas não faz sentido. Eles estão apenas armazenando valores em um banco de dados SQL com as chaves `login` e `nonce`. Se eu quiser usar SQL para armazenar os nonces, como exatamente seria meu banco de dados SQL?

Algumas outras informações que podem ajudar são para que estou usando isso - espero vincular um usuário do Discourse a uma conta do Minecraft gerando um link SSO que está vinculado à sua UUID. Após fazer login com sucesso no Discourse, vou armazenar a UUID e o ID do Discourse deles em uma tabela.

Até agora, consegui fazer o exemplo de PHP funcionar, mas acho que não estou entendendo completamente _como_ eu teria que modificá-lo para funcionar para o meu caso de uso. Idealmente, quero gerar o link através de uma solicitação GET e enviá-lo ao usuário, para que a UUID já esteja associada ao nonce.

Obrigado por esta postagem, pois eu estaria ainda mais perdido sem ela!

Editar: Para nonces, seria melhor armazenar nonces na tabela e procurar por eles? Eu sei que preciso corresponder ao nonce, mas, a menos que eu possa passar informações adicionais na URL de redirecionamento (o que não consegui fazer com sucesso), não tenho certeza de como referenciar o nonce corretamente.

---

<div class="post-metadata">

### Author: ![tachibanalolo](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tachibanalolo/32/233762_2.png) [@tachibanalolo](https://meta.discourse.org/u/tachibanalolo)
#### Post date: [Janeiro 3, 2022, 9:13am UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/121 "2022-01-03T09:13:49Z")

</div>

Criei um guia que permite ao administrador configurar o [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) no protocolo SAML padrão via SimpleSAMLphp.

> [@Set up your DiscourseConnect(DiscourseSSO) to SimpleSAMLphp, use your Discourse forum as a SAML IDP (Identify Provider)](https://meta.discourse.org/t/set-up-your-discourseconnect-discoursesso-to-simplesamlphp-use-your-discourse-forum-as-a-saml-idp-identify-provider/213654):
>
> Discourse has intergrated a [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) that allows you to change your Discourse into a SSO provider. You can find it in [“Using Discourse as an identity provider (SSO, DiscourseConnect)”](https://meta.discourse.org/t/using-discourse-as-an-identity-provider-sso-discourseconnect/32974) this article. However what it provides is not a standard SAML or Oauth protocol. So we need to use a [module](https://meta.discourse.org/t/using-discourse-as-an-identity-provider-sso-discourseconnect/32974/105) that created by Paul B. in Discourse forum. This is a module that allows us connect [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) to SimpleSAMLphp and then use SimpleSAMLphp to provide standard SAML login service protocol. In he…

---

<div class="post-metadata">

### Author: ![tachibanalolo](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tachibanalolo/32/233762_2.png) [@tachibanalolo](https://meta.discourse.org/u/tachibanalolo)
#### Post date: [Janeiro 3, 2022, 7:23pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/122 "2022-01-03T19:23:37Z")

</div>

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

> **Detalhe do Link**
>
> `/session/sso_provider?sso=bm9uY2U9NDA3YTVlNjg1ZTEwMDlh...`

Não tenho certeza por que está dando 502 bad gateway.

---

<div class="post-metadata">

### Author: ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)
#### Post date: [Janeiro 3, 2022, 8:47pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/123 "2022-01-03T20:47:00Z")

</div>

Eu editei parte do valor do parâmetro `sso` que você forneceu. A menos que alguém conhecesse sua chave secreta, não seria capaz de decodificar o valor, mas ainda assim parecia mais seguro não fornecer o valor completo. Não estará relacionado ao erro `502` que você está recebendo.

---

<div class="post-metadata">

### Author: ![tachibanalolo](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tachibanalolo/32/233762_2.png) [@tachibanalolo](https://meta.discourse.org/u/tachibanalolo)
#### Post date: [Janeiro 3, 2022, 9:53pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/124 "2022-01-03T21:53:54Z")

</div>

Parece um erro de banco de dados. Porque eu tentei o mesmo plugin e configuração em outro site do Discourse, e está funcionando. Como posso corrigir este problema?

---

<div class="post-metadata">

### Author: ![panic](https://avatars.discourse-cdn.com/v4/letter/p/3ab097/32.png) [@panic](https://meta.discourse.org/u/panic)
#### Post date: [Janeiro 11, 2022, 12:16pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/125 "2022-01-11T12:16:22Z")

</div>

Parece que tentar autenticar no discourse-auth-proxy com nomes de usuário ou grupos não ASCII (chinês no meu caso) leva a um erro porque os cookies não podem conter esses caracteres. Esta é a minha correção: (aviso: eu não sou muito familiarizado com golang)

```diff
diff --git a/main.go b/main.go
index 1b1dc28..18f8c9e 100644
--- a/main.go
+++ b/main.go
@@ -154,7 +154,12 @@ func redirectIfNoCookie(handler http.Handler, r *http.Request, w http.ResponseWr
 		var username, groups string

 		if err == nil && cookie != nil {
- username, groups, err = parseCookie(cookie.Value, config.CookieSecret)
+ var value string
+ value, err = url.QueryUnescape(cookie.Value)
+ if err != nil {
+ return
+ }
+ username, groups, err = parseCookie(value, config.CookieSecret)
 		}

 		if err == nil {
@@ -224,7 +229,7 @@ func redirectIfNoCookie(handler http.Handler, r *http.Request, w http.ResponseWr
 				cookieData := strings.Join([]string{username, strings.Join(groups, "|")}, ",")
 				http.SetCookie(w, &http.Cookie{
 						Name: cookieName,
- Value: signCookie(cookieData, config.CookieSecret),
+ Value: url.QueryEscape(signCookie(cookieData, config.CookieSecret)),
 						Expires: expiration,
 						HttpOnly: true,
 						Path: "/",

```

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [Janeiro 11, 2022, 12:36pm UTC](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974/126 "2022-01-11T12:36:56Z")

</div>

Obrigado por relatar! Você se importaria de fazer um PR no repositório do GitHub para que possamos mesclar essa alteração na versão oficial?

[Página anterior](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974.md?page=5)

[Próxima página](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974.md?page=7)
