Configurar DiscourseConnect - SSO Oficial para Discourse (sso)

DiscourseConnect é um recurso central do Discourse que permite configurar o “Single Sign-On (SSO)” para terceirizar completamente todo o registro e login de usuários do Discourse para outro site. Disponível para nossos clientes de hospedagem Pro, Business e Enterprise.

:information_source: (Fev 2021) ‘Discourse SSO’ agora é ‘DiscourseConnect’. Se você estiver executando uma versão antiga do Discourse, as configurações abaixo serão nomeadas sso_... em vez de discourse_connect_...

O Problema

Muitos sites que desejam integrar-se a um site do Discourse querem manter todo o registro de usuários em um site separado. Nesse tipo de configuração, todas as operações de login devem ser terceirizadas para esse outro site.

E se eu quiser SSO em conjunto com autenticação existente?

A intenção do DiscourseConnect é substituir a autenticação do Discourse. Se você deseja adicionar um novo provedor, consulte plugins existentes, como: Discourse VK Authentication (vkontakte)

Habilitando o DiscourseConnect

Para habilitar o DiscourseConnect, você precisa preencher 3 configurações:

enable_discourse_connect: deve ser habilitado, interruptor global
discourse_connect_url: a URL externa para a qual os usuários serão redirecionados ao tentar fazer login
discourse_connect_secret: uma string secreta usada para hash de payloads SSO. Garante que os payloads sejam autênticos.

Uma vez que enable_discourse_connect seja definido como true:

  • Clicar em login ou avatar redirecionará você para /session/sso, que, por sua vez, redirecionará os usuários para discourse_connect_url com um payload assinado.
  • Os usuários não poderão “alterar a senha”. Esse campo é removido do perfil do usuário.
  • Os usuários não poderão mais usar a autenticação do Discourse (nome de usuário/senha, Google, etc).

E se você marcá-lo por engano?

Veja: Log back in as admin after locking yourself out with read-only mode or an invalid SSO configuration

Implementando o DiscourseConnect no seu site

:warning: O Discourse usa e-mails para mapear usuários externos para usuários do Discourse e assume que os e-mails externos são seguros. SE VOCÊ NÃO VALIDAR ENDEREÇOS DE E-MAIL ANTES DE ENVIÁ-LOS PARA O DISCOURSE, SEU SITE SERÁ EXTREMAMENTE VULNERÁVEL!

Alternativamente, se você insistir em enviar e-mails não validados, CERTIFIQUE-SE de definir require_activation=true, o que forçará a validação de todos os e-mails pelo Discourse. AINDA RECOMENDAMOS FORTMENTE QUE VOCÊ NÃO FAÇA ISSO. Portanto, se você prosseguir com essa configuração habilitada, estará assumindo um risco substancial.

O Discourse redirecionará os clientes para discourse_connect_url com um payload assinado: (digamos que discourse_connect_url seja https://somesite.com/sso)

Você receberá tráfego de entrada com o seguinte:

https://somesite.com/sso?sso=PAYLOAD&sig=SIG

O payload é uma string codificada em Base64 composta por um nonce e um return_sso_url. O payload é sempre uma string de consulta válida.

Por exemplo, se o nonce for ABCD, o raw_payload será:

nonce=ABCD&return_sso_url=https%3A%2F%2Fdiscourse_site%2Fsession%2Fsso_login, esse raw payload é codificado em base 64.

O endpoint chamado deve:

  1. Validar a assinatura: garantir que o HMAC-SHA256 de PAYLOAD (usando discourse_connect_secret como chave) seja igual ao sig (sig será codificado em hexadecimal).
  2. Realizar qualquer autenticação necessária.
  3. Criar uma nova payload codificada em URL com pelo menos nonce, email e external_id. Você também pode fornecer alguns dados adicionais; aqui está uma lista de todas as chaves que o Discourse entenderá:
    • nonce deve ser copiado do payload de entrada.
    • email deve ser um endereço de e-mail verificado. Se o endereço de e-mail não foi verificado, defina require_activation como “true”.
    • external_id é qualquer string exclusiva para o usuário que nunca mudará, mesmo que seu e-mail, nome, etc. mudem. O valor sugerido é o número da linha ‘id’ do seu banco de dados.
    • username se tornará o nome de usuário no Discourse se o usuário for novo ou SiteSetting.auth_overrides_username estiver definido.
    • name se tornará o nome completo no Discourse se o usuário for novo ou SiteSetting.auth_overrides_name estiver definido.
    • avatar_url será baixado e definido como o avatar do usuário se o usuário for novo ou SiteSetting.discourse_connect_overrides_avatar estiver definido.
    • avatar_force_update é um campo booleano. Se definido como true, forçará o Discourse a atualizar o avatar do usuário, independentemente de avatar_url ter mudado ou não.
    • bio se tornará o conteúdo da biografia do usuário se o usuário for novo, sua biografia estiver vazia ou SiteSetting.discourse_connect_overrides_bio estiver definido.
    • title definirá o título do usuário.
    • website definirá o site do usuário em seu perfil.
    • location definirá a localização do usuário em seu perfil.
    • profile_background_url será baixado e definido como o plano de fundo do perfil do usuário se o usuário for novo ou SiteSetting.discourse_connect_overrides_profile_background estiver definido.
    • card_background_url será baixado e definido como o plano de fundo do cartão do usuário se o usuário for novo ou SiteSetting.discourse_connect_overrides_card_background estiver definido.
    • locale definirá o locale do usuário se o usuário for novo e SiteSetting.allow_user_locale estiver habilitado.
    • locale_force_update é um campo booleano. Se definido como true junto com locale, forçará a atualização do locale para usuários existentes (requer SiteSetting.allow_user_locale).
    • Campos booleanos adicionais (“true” ou “false”) são: admin, moderator, suppress_welcome_message, logout
  4. Codificar o payload em Base64.
  5. Calcular um hash HMAC-SHA256 do payload usando discourse_connect_secret como chave e o payload codificado em Base64 como texto.
  6. Redirecionar de volta para o return_sso_url com um parâmetro de consulta sso e sig (http://discourse_site/session/sso_login?sso=payload&sig=sig).

O Discourse validará que o nonce é válido e, se válido, expirará imediatamente para que não possa ser usado novamente. Em seguida, tentará:

  1. Fazer login no usuário procurando um external_id já associado no modelo SingleSignOnRecord.
  2. Fazer login no usuário usando o e-mail fornecido (atualizando external_id) (a menos que require_activation = true).
  3. Criar uma nova conta para o usuário fornecendo (email, username, name) e atualizando external_id.

Preocupações de segurança

O nonce (token de uso único) expirará automaticamente após 30 minutos. Isso significa que, assim que o usuário for redirecionado para seu site, ele terá 30 minutos para fazer login ou criar uma nova conta.

O protocolo é seguro contra ataques de replay, pois o nonce só pode ser usado uma vez. O nonce está vinculado à sessão atual do navegador para proteger contra ataques CSRF.

Especificando associação a grupos

Se a opção discourse connect overrides groups for especificada, o Discourse considerará a lista separada por vírgulas de grupos passada em groups.

Além de groups, você também pode especificar a associação a grupos em seu payload SSO usando os atributos add_groups e remove_groups, independentemente da opção discourse connect overrides groups.

add_groups é uma lista separada por vírgulas de nomes de grupos dos quais garantiremos que o usuário seja membro.
remove_groups é uma lista separada por vírgulas de nomes de grupos dos quais garantiremos que o usuário não seja membro.

Implementação de referência

O Discourse contém uma implementação de referência da classe SSO:

Uma implementação trivial seria:

class DiscourseSsoController < ApplicationController
  def sso
    secret = "MY_SECRET_STRING"
    sso = DiscourseApi::SingleSignOn.parse(request.query_string, secret)
    sso.email = "user@email.com"
    sso.name = "Bill Hicks"
    sso.username = "bill@hicks.com"
    sso.external_id = "123" # id único para cada usuário do seu aplicativo
    sso.sso_secret = secret

    redirect_to sso.to_url("http://l.discourse/session/sso_login")
  end
end

Transição para e a partir do single sign-on.

Enquanto o parâmetro require_activation não estiver definido como true no payload da solicitação, o sistema confiará nos e-mails fornecidos pelo endpoint de single sign-on. Isso significa que, se você tiver uma conta existente no passado no Discourse com o DiscourseConnect desabilitado, o DiscourseConnect simplesmente a reutilizará e evitará criar uma nova conta.

Se você desabilitar o DiscourseConnect, os usuários poderão redefinir senhas e recuperar o acesso às suas contas.

Exemplo do mundo real:

Dadas as seguintes configurações:

Domínio do Discourse: http://discuss.example.com
URL do DiscourseConnect: http://www.example.com/discourse/sso
Segredo do DiscourseConnect: d836444a9e4084d5b224a60c208dce14
E-mail validado: Não (adicione require_activation=true ao payload)

Tentativa de login do usuário

  • Um nonce é gerado: cb68251eefb5211e58c00ff1395f0c0b

  • Um raw payload é gerado: nonce=cb68251eefb5211e58c00ff1395f0c0b

  • O payload é codificado em Base64: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=

  • O payload é codificado em URL: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D

  • Um HMAC-SHA256 é gerado no payload codificado em Base64: 1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

Finalmente, o navegador é redirecionado para:

http://www.example.com/discourse/sso?sso=bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D&sig=1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

No outro extremo

  1. O payload é validado usando HMAC-SHA256; se a assinatura não corresponder, o processo é abortado.
  2. Revertendo as etapas acima, o nonce é extraído.

Usuário faz login:

name: sam
external_id: hello123
email: test@test.com
username: samsam
require_activation: true

Um payload sem assinatura é gerado:

nonce=cb68251eefb5211e58c00ff1395f0c0b&name=sam&username=samsam&email=test%40test.com&external_id=hello123&require_activation=true

a ordem não importa, os valores são codificados em URL

O payload é codificado em Base64:

bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ==

O payload é codificado em URL:

bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D

O payload codificado em Base64 é assinado:

3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

O navegador redireciona para:

http://discuss.example.com/session/sso_login?sso=bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D&sig=3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

Sincronizando registros do DiscourseConnect

Você pode usar o endpoint de administração POST /admin/users/sync_sso para sincronizar um registro do DiscourseConnect; passe a ele o mesmo registro que você passaria para o endpoint do DiscourseConnect; o nonce não importa.

Se você chamar admin/users/sync_sso de outro site, precisará incluir uma api_key de administrador válida e um api_username válido nos cabeçalhos da solicitação. Veja Sync DiscourseConnect user data with the sync_sso route para mais detalhes sobre como estruturar a solicitação.

Limpando registros do DiscourseConnect

Se seus valores de external_id do seu provedor DiscourseConnect mudaram (talvez você tenha alterado o algoritmo de geração, talvez seja um endpoint diferente), você pode remover com segurança todos os registros existentes usando o console do rails:

SingleSignOnRecord.destroy_all

Deslogando usuários

Você pode usar o endpoint de administração POST /admin/users/{USER_ID}/log_out para deslogar qualquer usuário no sistema, se necessário.

Para configurar o endpoint para o qual o Discourse redireciona ao fazer logout, pesquise pela configuração logout redirect. Se nenhuma URL tiver sido definida aqui, você será redirecionado de volta para a URL configurada em discourse connect url.

Pesquisar usuários por external_id

Os dados do perfil do usuário podem ser acessados usando o endpoint /users/by-external/{EXTERNAL_ID}.json. Isso retornará um payload JSON que contém as informações do usuário, incluindo o user_id, que pode ser usado com o endpoint log_out.

Implementações existentes

  • O gem discourse_api pode ser usado para SSO. Veja o código SSO em seu diretório de exemplos para ver uma implementação básica.

  • Nosso plugin WordPress facilita a configuração do SSO entre WordPress e Discourse. Detalhes sobre como configurá-lo são encontrados na aba SSO da página de opções do plugin.

Trabalhos futuros

  • Gostaríamos de reunir mais implementações de referência para SSO em outras plataformas. Se você tiver uma, por favor, poste na categoria Dev / SSO.

Recursos Avançados

  • Você pode passar campos de usuário personalizados prefixando o nome do campo com custom. Por exemplo, custom.user_field_1 pode ser usado para definir o valor do UserCustomField que tem o nome user_field_1.
  • Você pode passar avatar_url para substituir o avatar do usuário (SiteSetting.discourse_connect_overrides_avatar precisa estar habilitado). Avatares são armazenados em cache, então passe avatar_force_update=true para forçar a atualização se a URL for a mesma. Atualmente, você não pode passar uma URL vazia para desabilitar o avatar do usuário.
  • Por padrão, a mensagem de boas-vindas será enviada a todos os novos usuários criados via SSO. Se desejar suprimir isso, você pode passar suppress_welcome_message=true.
  • Para configurar sua instância do Discourse como um provedor DiscourseConnect, veja: Usando DiscourseConnect como provedor de identidade.

Depurando seu provedor DiscourseConnect

Para auxiliar na depuração do DiscourseConnect, você pode habilitar a configuração de site verbose_discourse_connect_logging. Ao habilitar essa configuração de site, diagnósticos detalhados aparecerão em YOURSITE.com/logs. Certifique-se de marcar a caixa de :white_check_mark: warnings na parte inferior de YOURSITE.com/logs.

Registraremos um aviso nos logs com um dump completo do payload SSO:

  • Toda vez que o processo DiscourseConnect for iniciado, registraremos um aviso no log com um dump completo do payload DiscourseConnect.

  • Toda vez que um usuário falhar ao completar o DiscourseConnect (devido ao nonce expirado ou bloqueio de IP).

:spiral_notepad: Precisa automatizar inscrições de usuários? Veja Auto-provisioning user accounts when SSO is enabled

174 curtidas
Discourse SSO + normal login
Sync DiscourseConnect user data with the sync_sso route
SSO login & logout issues
Is there a "log_in" SSO API endpoint?
SSO locked me out of Discourse!
What is the SSO login URL
With SSO my user still need to hit the login button
SSO Login page not showing up
How to handle Discourse SSO when the authentication site allows users to change emails?
"User Log out API" return success in response but user session still alive
SSO integration & external profile sync help
SSO on Discourse using Atlassian Crowd
Single Sign-Out?
Mobile (firebase) SSO authentication
Login to Discourse with website account details
Discourse SSO using auth0 via URL
Users who register on my site, register also on Discourse Vise Versa
Custom Login / Registration from another API
Automatically assigning users to a group
SSO and e-mail addresses having a plus sign
Automatic session management with OAuth SSO
Merging users from different forums
Advantage and disadvantage of enabling SSO
About the SSO category
Shibboleth / SAML / SSO -- Working Implementation for Higher Ed
How to generate nonce from client-side Javascript
Logout POST Request
Customized login auth plugin
User Fields to validate users
Enable sso for my site
Disable email verification for SSO
SSO with TownNews CMS
Using existing RoR application for user auth / signup instead of discourse
[PAID] Setup SSO for self-hosted instance
SSO locked me out of Discourse!
Discourse Ruby API testing "Unknown attribute 'auth_token' for User
Switching out authentication for a passwordless alternative
A way for admins to edit users' external IDs
Hashing Secret + Payload for SSO
Will Discourse ask for a username if it's not provided to /session/sso_login?
Categorizing and tracking users
Getting signed data from the server
Getting signed data from the server
SSO and changing email addresses upstream
SSO (maybe) specific issue
SSO (maybe) specific issue
Why isn't Discourse more frequently recommended as a "community platform"?
Integration with .NET MVC application for a SaaS platform
Running my own discourse image
How do I make discourse use my platform's autentication system?
Automatic addition of users to group based on email domain
Allowing people to login using accounts from other websites
Seeking Slack Login / SSO for Discourse
Smooth J/K navigation when using keyboard
SSO to Joomla site
Discourse Connect on Local instance is not working
Implementing SSO for dev environment and troubleshoot
Login with FB, google and apple only
SSO provider implementation - Admin, moderator and groups ignored?
How to divide my community into 2 parts
Using Discourse to add a forum feature to our current application?
Shared cookie SSO: Notifying frontend
User auth with website at root and Discourse in subfolder
Can I authenticate to Drupal via Discourse?
Difficulty of Tiered-access forum
Any way to not require email verification with WP as the SSO Provider?
How to enable sso on discourse?
How to auto-login user in application web view
[PAID] automatically change user email
Create apikey for user programmatically as admin
Bug when visiting same thread url
Open source will support customized provider SSO
Is there a way to get all emails of users with the API?
How can generate _forum_session and _t for an user through code/api call or without login to browser?
Show/hide forums based on the domain? (Shared forum via CNAME)
Integrate with DjangoRest and Vue.js
Connect Discourse Auth with my Django user DB?
Disable account confirm emails when creating users via API
Transforming usernames with SSO
Automatically provision accounts with external SSO provider? (skip Create New Account prompt)
Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)
Error ArgumentError in DiscourseSsoController#sso, wrong number of arguments (given 1, expected 0)
Embed variables in footer
Need help to setup SSO without emails
Programmatically log users out of discourse
How do I remove people from putting names? I have an API system I want in there
How to detect Discourse user on Ghost Blog?
Problem in sso redirection for compose a new pre-filled topic via URL
How to make default avatars and make sure nobody changes there avatar I want to set them an avatar with my API system
How might we better structure #howto?
Is Roblox Login Possible?
Discourse login with whmcs users
2.7.0.beta4: DiscourseConnect, Topic Timer UI revamp, Login Modal UI revamp, and more
Connecting Discourse invites to Marketo emails
Auto assign member to the certain group
Connecting to an external source of avatars?
Changing avatar_url while sso_overrides_avatar is set?
SSO - User Roles or ACLs to differentiate access levels
SSO - User Roles or ACLs to differentiate access levels
Disabling email verification
SSO Isnt working for me
Could Discourse offer a StackExchange-like SSO/Federated login service?
Mandatory username & avatar generation - How can we do this?
Intergrading discoures in to a application
Configure single sign-on (SSO) with WP Discourse and DiscourseConnect
How to connect to an external database running on localhost
Automate User Creation
Login Help - Correct way to login
What happens to my current users after configuring SSO?
SSO groups without completely overriding
JumpCloud LDAP/SSO
Usernames getting modified – numeral “1” being added
Is "partial" SSO possible?
Send an invite to a user but complete their profile programmatically
Magento 2 as SSO Provider?
Discourse SSO Provider doesn't redirect to return_sso_url as user logs in with custom SSO
Force password change after login
SSO and e-mail addresses having a plus sign
Would Discourse meet all of these niche needs to be a video game community forum?
OpenID Connect and SSO
Does `sso overrides groups` work with Oauth2?
Add user to group after purchase
Shibboleth SSO with Discourse
Using discourse forum in a native app (log-in, languages)
Discourse Connect: How implementing Discourse login with an existing database?
Sync group membership with external list of email addresses
Can I use my own Login page instead of discourse's Default login dialog box?
Modify the URL of 'create your account' button to an external site
How to add a custom url text link on the login page
Can discourse delete archived posts automatically and accept registration without email?
SSO is forcibly creating the user as an admin
Onboarding 15k Trial Users/Year: Need Help Streamlining the Process
Is DiscourseConnect available for self-hosted?
Is DiscourseConnect available for self-hosted?
How to Disable Required SSO Email Activation
User avatar selection through API no longer working
Wordpress plugin not redirect to discourse login automatically
Discourse login by cookie token
Custom field in discourseconnect
Logging users in through c++ desktop application
Invite only by email from database
Is it possible to autologin discourse via iframe?
Login w/ Discourse w/o SSO?
Wordpress plugin not redirect to discourse login automatically
Discourse Hosting Limits?
DiscourseConnect always returns "Nonce is incorrect, ..."
Has anyone succeeded in using discourse as sso provider for nextcloud? Share recipe?
SSO in C# .NET App
Intergrate Discourse with keycloak
Allow my application users to login to discourse
Feature: create default user name from email's user portion when using Google OAuth2/SSO
SSO login appears to have stopped working
Is there a way to use both local login and discourseConnect?
Discourse Hosting Limits?
Changing email addresses not working as an Admin
Populating email field on login page
Problem on SSO Login
SSO Broken - The requested URL or resource could not be found
Adding Discourse to existing Ruby on Rails site
Can I use DiscourseConnect along with Discourse Native Registration?
SSO Login with Discourse
Synchronize SSO login state between Discourse and provider
Connection and discourse account creation without going on discourse
Migrate an IPB 3.1 forum to Discourse
Disable DiscourseConnect
How to use Discourse Connect (SSO) to update avatar, username, name?
Label Sets
Unable to setup discourse in my windows 10
Embed Discourse comments on another website via Javascript
How admin user re-logins after using discourse connect sso and custom domain
How to "intercept" first time SSO usages to let users confirm the SSO action and set a username?
How to create a login on my front-end application to a specific Discourse site?
Use Discourse as an identity provider (SSO, DiscourseConnect)
Connect discourse with magento?
Users allowed to see only some categories
Admin status repeatedly revoked
Plugin to integrate Shopify accounts with Discourse
How to do single sign-on with forum program?
Simple login by email via deep links containing a username
How to set language for SSO users
Want to set internal forum on our reactjs member's platform
New instructions for SSO setup? "enable discourse connect" setting is missing
Add a new user via API
Configure GitHub login for Discourse
Use SSO to auto create Discourse login/password after signed up in my SaaS
How can I change the registration URL?
How do I go about making a very customized theme?
Unable to disable SSO via SSH
Is it possible to have an automatically updating link to a user's profile picture? Such as by giving each user one "slot" for an avatar?
SSO broken after rebuild with stable v3.3.3
Using Discourse Connect with a mobile app
Disable DiscourseConnect
Missing anchor links in certain TOC topics?
Integration into custom auth system where emails are not unique?
WP-Discourse not connected and admin email not recognized
How to disable SMTP during installation?
Auto Login to my Discourse site / subdomain
How to Disable activation_reminder email sending?
Extending header buttons
Auth via Discourse Forum
🧩 How to Build an Android App User Community with Discourse? [HeyApks Project]
Postgres doesn't seem to be running when running Discourse locally using Docker
Discourse sso login redirect to localhost:3000, not 4200 (running via docker)
Cross-Discourse Quoting
Is it Possible to Send Encrypted Email and Password in the Authentication Flow?
Nutzung von Nextcloud aus Discourse heraus
Inherited forum with old Discourse Connect Config and Looking for Some Guidance
Merging user accounts
Understanding PII storage in Discourse
Auto-provisioning user accounts when SSO is enabled
REQUEST: Highly Effective Age Assurance (OneID Phone No. Age Verification) Integration
Intergrate Discourse with keycloak
Auto-sign-in with the OpenId Connect Plugin and AWS Cognito
How can I configure Single Sign On for our App to the Discourse Community Forum
Auto-assign random, anonymous usernames
Communities using discourse SSO for their in-app community experience
Login to Discourse with custom Oauth2 provider
Can I log into multiple instances of discourse simultaneously?
Upgraded last night and login button no longer works
SSO with Roles translating to Groups
Redirect login possible?
How to disable SSO via SSH
Connect Multiple WP Sites To 1 Discourse Installation?
What is the procedure to obtain CAS between my website and my discourse instance?
Problem logging in using SSO plugin
PAID: Create Open Source SSO plugin to auth with Wild Apricot
Trouble connecting drupal and discourse
About the idea: IDENTITY = EMAIL
About the idea: IDENTITY = EMAIL
Consequences of not validating email addresses
SSO and Restricted Groups
Questions about Discourse on Digital Ocean
Require users to join at least one group at sign-up
Use the same user database and login credentials in multiple discourse instances
How to connect my (existing) User Database?
User group sync with drupal
Options with SSO with another custom application
Issues in Integrating SSO in Discourse
How to implement Discourse with an already built Rails project
Updating SSO documentation
Configuring SSO to Work With SocialEngine
Updating SSO documentation
Discourse view file update does not reflect in browser
Discourse view file update does not reflect in browser
Trying to set up SSO
Discourse doesn't re-verify an address changed by SSO
Discourse doesn't re-verify an address changed by SSO
SSO and Discourse Consulting
Changing the unique key to identify users
Setting the user title(group?) based on the information that is coming from the sso payload
Advice needed for tailoring Discourse to my organisation
Primary and Discourse Site Integrations
Automatic Table of Contents generation
Questions Regarding Account Authentication Methods
Redirect all users who click on domain.com/signup to a different page
Poll Result Breakdown
Cant update email via API - invalid_access error
Disabling all emails except those registration related?
Can't get avatar overrides to work over SSO
Conflicting email addresses, giving admins more power to resolve issues
Which Discourse hosting tier should I choose?
New users via API if allow new unchecked
How to change login settings without being logged in?
Data explorer query to list the longest "estimated read time" topics?
Create user in discourse by redirecting from another site
HMAC-256 example on Official SSO page
Add links to meta.discourse.org instructions inside admin
How to configure the SSO Authorization URL via config (without using the admin panel)
TeamAndro exploring a migration from phpBB
DiscourseConnect payload hash encoding mismatch
Disabling SSO in development environment
Getting signed data from the server

Olá, é difícil para mim encontrar em qualquer lugar, mas qual protocolo isso usa? Assumir oauth2? Os parâmetros não parecem corresponder, e recebo um erro do provedor de que ele parece estar aceitando um parâmetro sso=? Ajuda!

Obrigado

DiscourseConnect é a implementação de SSO do Discourse. Ele não usa um protocolo padrão.

Se você não se importar em olhar o código PHP, há um exemplo de implementação aqui: wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub.

Sim, isso não vai funcionar. Se você tiver um provedor OAuth2 que gostaria de usar para autenticar usuários, dê uma olhada no plugin Discourse OAuth2 Basic.

1 curtida

Obrigado @simon. O código PHP é um provedor também, e não um consumidor? Também vi um provedor OIDC que pode funcionar e também um provedor “intermediário” na área de plugins.

Se o provedor SSO não for padrão, para quem/o que ele se destina se não funcionar bem com outros?

Obrigado novamente!

O código que eu linkei é para usar o WordPress como provedor de autenticação para o Discourse.

O plugin do WordPress também permite que o WordPress seja usado como um cliente DiscourseConnect: wp-discourse/lib/sso-client at main · discourse/wp-discourse · GitHub.

Não tenho certeza qual foi a motivação para adicionar uma implementação SSO personalizada ao Discourse. Imagino que houve um caso de negócio para isso.

Um benefício que ele fornece é que permite que um site externo seja rigidamente integrado ao Discourse. Por exemplo, todos os atributos de usuário listados aqui podem ser sincronizados com o Discourse durante o processo de autenticação: discourse/lib/discourse_connect_base.rb at 7b89fdead98606d4f47ceb0a1d240d0f6e5f589e · discourse/discourse · GitHub.

Ele também permite que sites que não estão configurados para serem provedores OAuth2 ou OpenID Connect sejam usados para autenticar usuários no Discourse.

A desvantagem é que exige a adição de algum código personalizado no site do provedor de autenticação.

1 curtida

Olá, estou curioso sobre quais são os problemas de não verificar endereços de e-mail em um site externo que fornece SSO. É apenas que isso permite spam automatizado? Ou existem outras considerações? Por que não é recomendado que o Discourse lide com a verificação de e-mail se o site externo não o fizer?

Obrigado por qualquer insight adicional.

O pior cenário que conheço requer estas condições:

  • os endereços de e-mail não são verificados no site externo
  • require_activation=true não está definido no payload do SSO
  • existem contas existentes no site Discourse que não têm um SingleSignOnRecord associado a elas (o proprietário da conta nunca fez login no Discourse com SSO)

Nesse caso, alguém poderia se inscrever no site externo usando o endereço de e-mail de um usuário do Discourse que nunca fez login com SSO. Isso permitiria que a conta não verificada do site externo assumisse a conta do Discourse que usa o mesmo endereço de e-mail. Isso seria especialmente preocupante se fosse uma conta de administrador no Discourse.

É recomendado que o Discourse lide com a verificação de e-mail se o site externo não estiver lidando com isso:

Existem algumas razões pelas quais é melhor lidar com a verificação de e-mail no site externo:

  • forçar os usuários a receber o e-mail de confirmação do Discourse adiciona algum atrito quando os usuários tentam fazer login no Discourse pela primeira vez. (Realisticamente, esse atrito tem que acontecer em algum lugar - seja no lado do Discourse ou no lado do site externo.)
  • O Discourse não corresponderá às contas existentes do Discourse com logins externos com base no endereço de e-mail se require_activation for definido como true no payload do SSO. Isso é um problema se você habilitar o DiscourseConnect depois que algumas contas foram criadas no Discourse registrando-se com nome de usuário/senha. Também é um problema se, por qualquer motivo, você precisar excluir entradas SingleSignOnRecord no Discourse. O Discourse não criará automaticamente novas entradas SingleSignOnRecord quando os usuários tentarem fazer login novamente no Discourse.
4 curtidas

Obrigado, @simon - isso é muito útil!

Olá, tenho uma dúvida sobre o campo groups na carga útil do SSO.

Grupos automatizados (como administradores, moderadores e níveis de confiança) também serão substituídos? Ou serão mantidos?

Não! Assumindo que a descrição dessa configuração esteja correta, ela afetará apenas grupos manuais.

Sabe de uma coisa… eu não vi a palavra “manual” na descrição. Parece promissor para o meu caso de uso, vou tentar e reportar.

1 curtida

Quando li isto, pensei que deveria gerar a assinatura diretamente da carga útil codificada em base64. Não percebi que é preciso gerá-la a partir dos bytes UTF-8. Poderia isto ser esclarecido?

Tenho brincado com o DiscourseConnect - a documentação é ótima, obrigado.
No entanto, encontrei alguns obstáculos sobre os quais espero obter ajuda/esclarecimento.

Queremos que os usuários possam fazer login no WordPress usando seu login do Discourse (isso está funcionando bem :slight_smile: ) - no entanto.

  • É possível criar um usuário do WordPress via Cadastro no Discourse (quando um usuário cria uma conta no Discourse, ela cria automaticamente uma conta/perfil no WordPress para que eles possam fazer login no WordPress)?

  • É possível sincronizar Grupos de Usuários do WordPress e Grupos do Discourse?
    Se um usuário tiver uma conta de usuário tanto no WordPress quanto no Discourse, o DiscourseConnect é capaz de uni-las - mas não dá à conta do WordPress os Grupos de Usuários dos Grupos do Discourse com o mesmo nome, e vice-versa (e o que acontece se os grupos não tiverem o mesmo nome - como posso dizer ao DiscourseConnect para dar o Grupo de Usuário ‘Grupo de Testes’ quando o usuário tem o Grupo do Discourse ‘Grupo para Testar Coisas’?

O que estou perdendo?

Eu não sei a resposta, mas…

Tenha cuidado com isso. É algo ilegal e amplamente considerado má prática (fora os proprietários do site, é claro :smirking_face:), pois aconteceria sem o consentimento e conhecimento do usuário, e ao mesmo tempo os dados seriam movidos para outro lugar.

Claro, isso está em uma área cinzenta e, basicamente, por exemplo, o Google está fazendo isso.

Mas… por quê? Limite o login apenas ao Discourse SSO no lado do WordPress e redirecione os usuários para o Discourse para criação de conta e pronto. Mas, tanto quanto sei, você não pode sincronizar contas de usuário automaticamente. E por que deveria, já que com o SSO isso acontece quando um usuário precisa.

Em nosso cenário (como uma organização de membros)

  • O WordPress é usado para gerenciar assinaturas, comprar itens na loja do WordPress e usamos Grupos de Usuários para gerenciar o que um membro pode fazer na organização
  • O Discourse é nosso fórum/comunidade online e usamos Grupos para controlar a quais áreas do Discourse um usuário tem acesso)

Atualmente, um novo membro precisa configurar uma Conta do WordPress (e configurar sua assinatura, etc.) e também configurar uma conta no Discourse, e os Grupos de Usuários-Grupos do Discourse são gerenciados/sincronizados manualmente.

Estou tentando encontrar uma solução onde um novo usuário faça uma única configuração para criar ambas as contas, e os Grupos de Usuários-Grupos do Discourse sejam sincronizados automaticamente - tenho certeza de que posso resolver a sincronização de grupos com APIs, etc. É a configuração de conta de usuário múltipla que estou tentando resolver/evitar.

Parece que o que você está fazendo é usar o Discourse como provedor de SSO para o WordPress. Essa abordagem está descrita aqui: Use o Discourse como um provedor de identidade (SSO, DiscourseConnect). O plugin Discourse WordPress tem opções para usar o WordPress como provedor de SSO para o Discourse, ou para usar o Discourse como um provedor de identidade para o WordPress. Usar o mesmo nome para ambas as abordagens leva a alguma confusão.

Eu ficaria tentado a usar o WordPress como o provedor de identidade para este caso. Com essa abordagem, os usuários criarão contas em seu site WordPress e, em seguida, farão login no Discourse com suas credenciais do WordPress. Uma coisa a ter em mente com essa abordagem é que isso significa que os usuários só poderão fazer login no Discourse através do WordPress, não será possível criar uma conta no Discourse sem já ter uma conta no WordPress. Acho que essa é a configuração apropriada ao integrar o Discourse com um site de membros do WordPress.

Quando o WordPress é usado como provedor de identidade para o Discourse, existem algumas funções utilitárias que são úteis para definir as associações de grupo do Discourse de um usuário com base em sua atividade no WordPress. Essas funções estão descritas aqui: Gerenciar associação de grupo no Discourse com WP Discourse SSO.

Voltando à sua pergunta original:

Faz um tempo que não olho o código do Cliente DiscourseConnect do plugin WordPress, mas acho que o que você está pedindo é mais ou menos como esse código é esperado funcionar. Se um usuário tiver uma conta no Discourse, ele só precisa clicar no link “Fazer login através do Discourse” no WordPress e uma conta será criada para ele.

Isso seria tecnicamente possível ao usar o WordPress como Cliente DiscourseConnect, mas a menos que algo tenha mudado, você não poderá usar os métodos add_user_to_discourse_group e remove_user_from_discourse_group que estão descritos na documentação que linkei. Você precisaria fazer algo como configurar um Webhook do Discourse que fosse acionado quando um usuário fosse adicionado a um grupo do Discourse, então adicionar algum código no WordPress para processar esse webhook. Para sincronizar grupos do WordPress para o Discourse, você precisaria fazer uma chamada de API para o Discourse para atualizar os grupos de um usuário quando houvesse uma mudança no WordPress. Portanto, algo que seria bastante fácil de realizar se você usar o WordPress como provedor do DiscourseConnect pode ser um tanto complicado se você usar o WordPress como cliente do DiscourseConnect.

1 curtida

Exceto se o login personalizado for usado, como geralmente é a situação com WooCommerce/memberships/LLM mostrando esse botão e forçando o uso apenas do Discourse SSO como provedor não está acontecendo pronto para uso e precisa de algum trabalho personalizado.

Existem alguns problemas possíveis, um relacionado ao cache e outro relacionado a redirecionamentos de login que são adicionados por alguns plugins. Qualquer pessoa que encontrar esses problemas deve perguntar sobre eles na categoria Support > WordPress. Eles geralmente são facilmente resolvidos.

Esqueci totalmente de dar retorno: de fato funciona exatamente como descrito, apenas grupos manuais são afetados.

Olá @simon,
Acho que realmente preciso de ajuda com a resposta 404 da minha prova de conceito (POC) deste recurso SSO. Tenho trabalhado neste problema o dia todo, mas ainda não consigo descobrir qual é o problema. Consegui:

  1. Habilitar o discourse_connect
  2. Definir o discourse_connect_url para https://localhost:4200/login
  3. Segredo do discourse-connect: 20’s (1) 1111111111111111111 para simplificar

Então, na minha página de login do meu aplicativo Angular, enviei esta solicitação seguindo o código:


mas recebi a resposta 404 não encontrada.

Pelo que entendi, ao enviar uma solicitação POST para o endpoint admin/users/sync_sso, se o usuário não existisse no Discourse, ele deveria criar um novo usuário com base no user_id e email, então o resultado retornado deveria ser um objeto de usuário, não um objeto vazio com código de status 404.
Também verifiquei o log e ele não forneceu nenhuma informação relacionada a essa resposta falha.

Obrigado antecipadamente!