Então você quer usar o Discourse como provedor de identidade para sua própria aplicação web? Ótimo! Vamos começar.
Habilitar a configuração do provedor DiscourseConnect
Em Configurações do site de administração do Discourse (/admin/site_settings), habilite a configuração enable discourse connect provider e adicione uma string secreta a discourse connect provider secrets (usada para hash de payloads SSO).
Implementar o DiscourseConnect em sua aplicação web:
-
Gere um nonce aleatório nonce. Vamos chamar esse valor de
NONCE. Salve-o temporariamente para que você possa verificá-lo com o valor nonce que será retornado na resposta. -
Crie um novo payload com o
NONCEe umaRETURN_URL(para onde o Discourse redirecionará o usuário após a verificação). O payload deve ser assim:nonce=NONCE&return_sso_url=RETURN_URL. O host daRETURN_URLdeve corresponder ao padrão de domínio que você usou ao configurardiscourse connect provider secrets. -
Codifique em Base64 o payload bruto acima. Vamos chamar esse payload de
BASE64_PAYLOAD -
Codifique em URL o
BASE64_PAYLOADacima. Vamos chamar esse payload deURL_ENCODED_PAYLOAD -
Gere uma assinatura HMAC-SHA256 do
BASE64_PAYLOADusando seu segredo de provedor SSO como chave, depois crie uma string hex em minúsculas a partir disso. Vamos chamar essa assinatura deHEX_SIGNATURE
Enviar solicitação de autenticação para o Discourse
Redirecione o usuário para DISCOURSE_ROOT_URL/session/sso_provider?sso=URL_ENCODED_PAYLOAD&sig=HEX_SIGNATURE
Receber resposta do Discourse:
Se as etapas acima forem feitas corretamente, o Discourse redirecionará o usuário logado para a RETURN_URL fornecida. Você receberá parâmetros de query string com sig e sso junto com algumas informações do usuário. Agora siga as etapas abaixo:
-
Calcule o HMAC-SHA256 de
ssousando o segredo do provedor SSO como sua chave. -
Converta
sigde sua representação de string hex de volta para bytes. -
Certifique-se de que os dois valores acima sejam iguais.
-
Decodifique em Base64
sso; você obterá a query string incorporada passada. Isso terá uma chave chamadanoncecujo valor deve corresponder ao nonce passado originalmente. Certifique-se de que este é o caso e exclua o nonce do seu sistema. -
Você descobrirá que essa query string também conterá um monte de informações do usuário. Use como achar melhor.
Pronto. Agora você deve ter configurado sua aplicação web para usar o Discourse como provedor SSO!
Mais Parâmetros, Mais Opções
Além de nonce e return_sso_url, o payload da solicitação tem vários parâmetros opcionais adicionais.
-
prompt: Seprompt=none, então a solicitação SSO é tratada como uma solicitação de “apenas verificação”. Se o navegador/dispositivo já estiver logado no Discourse, o Discourse retornará uma resposta SSO bem-sucedida contendo informações de autenticação do usuário, como de costume. Se o navegador/dispositivo não estiver logado, o Discourse não solicitará que o usuário faça login e retornará imediatamente uma resposta SSO contendo o parâmetrofailed=trueem vez de informações do usuário. Isso fornece um mecanismo para consultar se o usuário está logado, sem nunca direcionar o usuário para um diálogo de login caso não esteja. -
logout: Selogout=true, então a solicitação SSO se torna uma solicitação de logout. Se um usuário estiver logado no Discourse nesse navegador/dispositivo, ele será desconectado desse dispositivo. Em ambos os casos, o Discourse redirecionará imediatamente de volta para areturn_sso_url, semssoousigadicionados à query string. -
require_2fa: Serequire_2fa=true, o Discourse exigirá que o usuário verifique a autenticação de dois fatores antes de ser redirecionado de volta. A resposta do payload incluiráconfirmed_2fa=truese o usuário concluiu com sucesso a verificação 2FA, ouno_2fa_methods=truese o usuário não tiver métodos 2FA configurados.
prompt=none e logout=true são mutuamente exclusivos; não faz sentido fornecer ambos na mesma solicitação.
Referência do Payload sso=
Parâmetros de solicitação:
nonce: (string, obrigatório) uma string aleatória gerada de forma segurareturn_sso_url: (string, obrigatório) a URL para a qual redirecionar com a respostaprompt: (string, opcional) Senone, sonda o status de autenticação sem solicitar o login do usuário.logout: (booleano, padrãofalse) Setrue, desconecta o usuário do Discourse.require_2fa: (booleano, padrãofalse) Setrue, exige que o usuário verifique a autenticação de dois fatores antes de redirecionar de volta.
Parâmetros de resultado:
-
Não há payload
sso=ou assinatura em resposta a uma solicitação de logout, apenas um redirecionamento para areturn_sso_urlsimples da solicitação. -
O payload de resultado para uma solicitação de login sempre conterá o
nonce, refletido da solicitação. -
O payload de resultado também refletirá quaisquer outros parâmetros de solicitação. Não confie nesse comportamento; não é necessariamente intencional e não é um aspecto garantido da API. (Por exemplo, por que o parâmetro
return_sso_urlé copiado para o payload que é enviado para areturn_sso_url?) -
Se a solicitação falhou ao autenticar um usuário, o payload de resultado conterá
failed=true. -
Se a solicitação conseguiu autenticar um usuário, o payload de resultado conterá as credenciais/informações do usuário:
external_id: (string) ID do usuário do Discourseusername: (string) nome de usuário/identificadorname: (string) nome real do usuárioemail: (string) endereço de e-mailavatar_url: (string) URL CDN completa da imagem de avatar carregada pelo usuárioadmin: (booleano)truese o usuário for Administrador, caso contráriofalsemoderator: (booleano)truese o usuário for Moderador, caso contráriofalsegroups: (string) lista de grupos (por nome) separados por vírgula aos quais o usuário pertenceprofile_background_url: (string) URL CDN completa da imagem de fundo do perfil do usuáriocard_background_url: (string) URL CDN completa da imagem de fundo do cartão do usuárioconfirmed_2fa: (booleano)truese o usuário concluiu a verificação 2FA (só presente quandorequire_2fa=truefoi solicitado)no_2fa_methods: (booleano)truese o usuário não tiver métodos 2FA configurados (só presente quandorequire_2fa=truefoi solicitado)
name,avatar_url,profile_background_urlecard_background_urlpodem estar ausentes se o usuário não os definiu. (Qualquer elemento com valornildentro do Discourse será omitido da resposta.)
Implementações oficiais do Discourse sobre “Usando o Discourse como provedor de identidade”:
- Um proxy http (usando golang) que usa o Discourse SSO para autenticar usuários (somente administradores): GitHub - discourse/discourse-auth-proxy: An http proxy that uses the DiscourseConnect protocol to authenticate users · GitHub (feito por @sam)
Implementações de comunidade contribuídas sobre “Usando o Discourse como provedor SSO”:
-
Um script PHP que implementa o Discourse como provedor SSO: Discourse sso provider login · GitHub (feito por @paxmanchris)
-
Erlang:
https://github.com/reverendpaco/discourse-as-sso-erlang -
Node.js:
GitHub - edhemphill/passport-discourse: A Passport strategy for authenticating using a Discourse forum · GitHub
GitHub - ArmedGuy/discourse_sso_node: npm package for Discourse SSO login features. · GitHub -
ASP.NET Core (requer apenas configuração):
GitHub - Biarity/DiscourseSso: Easy, configurable Discourse SSO: GET /auth/login -> recieve a JWT with user data · GitHub -
Extensão MediaWiki (PHP):
DiscourseSsoConsumer, a SSO extension for MediaWiki (feito por @mdoggydog)
