Einrichtung von DiscourseConnect – Offizielles Single-Sign-On für Discourse (sso)

DiscourseConnect is a core Discourse feature that allows you to configure “Single Sign-On (SSO)” to completely outsource all user registration and login from Discourse to another site. Offered to our pro, business and enterprise hosting customers.

:information_source: (Feb 2021) ‘Discourse SSO’ is now ‘DiscourseConnect’. If you are running an old version of Discourse, the settings below will be named sso_... rather than discourse_connect_...

The Problem

Many sites wishing to integrate with a Discourse site want to keep all user registration in a separate site. In such a setup all login operations should be outsourced to that different site.

What if I would like SSO in conjunction with existing auth?

The intention around DiscourseConnect is to replace Discourse authentication, if you would like to add a new provider see existing plugins such as: Discourse VK Authentication (vkontakte)

Enabling DiscourseConnect

To enable DiscourseConnect you have 3 settings you need to fill out:

enable_discourse_connect : must be enabled, global switch
discourse_connect_url: the offsite URL users will be sent to when attempting to log on
discourse_connect_secret: a secret string used to hash SSO payloads. Ensures payloads are authentic.

Once enable_discourse_connect is set to true:

  • Clicking on login or avatar will, redirect you to /session/sso which in turn will redirect users to discourse_connect_url with a signed payload.
  • Users will not be allowed to “change password”. That field is removed from the user profile.
  • Users will no longer be able to use Discourse auth (username/password, google, etc)

What if you check it by mistake?

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

Implementing DiscourseConnect on your site

:warning: Discourse uses emails to map external users to Discourse users, and assumes that external emails are secure. IF YOU DO NOT VALIDATE EMAIL ADDRESSES BEFORE SENDING THEM TO DISCOURSE, YOUR SITE WILL BE EXTREMELY VULNERABLE!

Alternatively, if you insist on sending unvalidated emails BE SURE to set require_activation=true, this will force all emails to be validated by Discourse. WE STILL STRONGLY ADVISE THAT YOU DO NOT DO THIS, so if you proceed with that setting enabled, you are assuming substantial risk.

Discourse will redirect clients to discourse_connect_url with a signed payload: (say discourse_connect_url is https://somesite.com/sso)

You will receive incoming traffic with the following

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

The payload is a Base64 encoded string comprising of a nonce, and a return_sso_url. The payload is always a valid querystring.

For example, if the nonce is ABCD. raw_payload will be:

nonce=ABCD&return_sso_url=https%3A%2F%2Fdiscourse_site%2Fsession%2Fsso_login, this raw payload is base 64 encoded.

The endpoint being called must

  1. Validate the signature: ensure that HMAC-SHA256 of PAYLOAD (using discourse_connect_secret, as the key) is equal to the sig (sig will be hex encoded).
  2. Perform whatever authentication it has to
  3. Create a new url-encoded payload with at least nonce, email, and external_id. You can also provide some additional data, here’s a list of all keys that Discourse will understand:
    • nonce should be copied from the input payload
    • email must be a verified email address. If the email address has not been verified, set require_activation to “true”.
    • external_id is any string unique to the user that will never change, even if their email, name, etc change. The suggested value is your database’s ‘id’ row number.
    • username will become the username on Discourse if the user is new or SiteSetting.auth_overrides_username is set.
    • name will become the full name on Discourse if the user is new or SiteSetting.auth_overrides_name is set.
    • avatar_url will be downloaded and set as the user’s avatar if the user is new or SiteSetting.discourse_connect_overrides_avatar is set.
    • avatar_force_update is a boolean field. If set to true, it will force Discourse to update the user’s avatar, whether avatar_url has changed or not.
    • bio will become the contents of the user’s bio if the user is new, their bio is empty or SiteSetting.discourse_connect_overrides_bio is set.
    • Additional boolean (“true” or “false”) fields are: admin, moderator, suppress_welcome_message
  4. Base64 encode payload
  5. Calculate a HMAC-SHA256 hash of the payload using discourse_connect_secret as the key and Base64 encoded payload as text
  6. Redirect back to the return_sso_url with an sso and sig query parameter (http://discourse_site/session/sso_login?sso=payload&sig=sig)

Discourse will validate that the nonce is valid, and if valid, it will expire it right away so it can not be used again. Then, it will attempt to:

  1. Log the user on by looking up an already associated external_id in the SingleSignOnRecord model
  2. Log the user on by using the email provided (updating external_id) (unless require_activation = true)
  3. Create a new account for the user providing (email, username, name) updating external_id

Security concerns

The nonce (one time token) will expire automatically after 10 minutes. This means that as soon as the user is redirected to your site they have 10 minutes to log in / create a new account.

The protocol is safe against replay attacks as nonce may only be used once. The nonce is tied to the current browser session to protect against CSRF attacks.

Specifying group membership

If the discourse connect overrides groups option is specified, Discourse will consider the comma separated list of groups passed in groups.

Aside from groups, you may also specify group membership in your SSO payload using the add_groups and remove_groups attributes regardless of the discourse connect overrides groups option.

add_groups is a comma delimited list of group names we will ensure the user is a member of.
remove_groups is a comma delimited list of group names we will ensure the user is not a member of.

Reference implementation

Discourse contains a reference implementation of the SSO class:

A trivial implementation would be:

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" # unique id for each user of your application
    sso.sso_secret = secret

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

Transitioning to and from single sign on.

As long as the require_activation parameter is not set to true in the request payload, the system will trusts emails provided by the single sign on endpoint. This means that if you had an existing account in the past on Discourse with DiscourseConnect disabled, DiscourseConnect will simply re-use it and avoid creating a new account.

If you ever turn off DiscourseConnect, users will be able to reset passwords and gain access back to their accounts.

Real world example:

Given the following settings:

Discourse domain: http://discuss.example.com
DiscourseConnect url : http://www.example.com/discourse/sso
DiscourseConnect secret: d836444a9e4084d5b224a60c208dce14
Email validated: No (add require_activation=true to the payload)

User attempt to login

  • Nonce is generated: cb68251eefb5211e58c00ff1395f0c0b

  • Raw payload is generated: nonce=cb68251eefb5211e58c00ff1395f0c0b

  • Payload is Base64 encoded: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=

  • Payload is URL encoded: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D

  • HMAC-SHA256 is generated on the Base64 encoded Payload: 1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

Finally browser is redirected to:

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

On the other end

  1. Payload is validated using HMAC-SHA256, if the sig mismatches, process aborts.
  2. By reversing the steps above nonce is extracted.

User logs in:

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

Unsigned payload is generated:

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

order does not matter, values are URL encoded

Payload is Base64 encoded

bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ==

Payload is URL encoded

bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D

Base64 encoded Payload is signed

3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

Browser redirects to:

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

Synchronizing DiscourseConnect records

You can use the POST admin endpoint /admin/users/sync_sso to synchronize a DiscourseConnect record, pass it the same record you would pass to the DiscourseConnect endpoint, nonce does not matter.

If you call admin/users/sync_sso from another site, you will need to include a valid admin api_key and a valid api_username in the request’s headers. See Sync DiscourseConnect user data with the sync_sso route for more details about how to structure the request.

Clearing DiscourseConnect records

If your external_id values from your DiscourseConnect provider have changed (perhaps you changed the generation algorithm, perhaps it’s a different endpoint) you can safely remove all the existing records using the rails console:

SingleSignOnRecord.destroy_all

Logging off users

You can use the POST admin endpoint /admin/users/{USER_ID}/log_out to log out any user in the system if needed.

To configure the endpoint Discourse redirects to on logout search for the logout redirect setting. If no URL has been set here you will be redirected back to the URL configured in discourse connect url.

Search users by external_id

User profile data can be accessed using the /users/by-external/{EXTERNAL_ID}.json endpoint. This will return a JSON payload that contains the user information, including the user_id which can be used with the log_out endpoint.

Existing implementations

  • The discourse_api gem can be used for SSO. Have a look at the SSO code in its examples directory to see a basic implementation.

  • Our WordPress plugin makes it easy to configure SSO between WordPress and Discourse. Details about setting it up are found on the SSO tab of the plugin’s options page.

Future work

  • We would like to gather more reference implementations for SSO on other platforms. If you have one please post to the Dev / SSO category.

Advanced Features

  • You can pass through custom user fields by prefixing the field name with custom. For example custom.user_field_1 can be used to set the value of the UserCustomField that has the name user_field_1.
  • You can pass avatar_url to override user avatar (SiteSetting.discourse_connect_overrides_avatar needs to be enabled). Avatars are cached so pass avatar_force_update=true to force them to update if the url is the same. Right now, you can’t pass an empty url to disable users’ avatar.
  • By default the welcome message will be sent to all new users created through SSO. If you wish to suppress this you can pass suppress_welcome_message=true
  • To configure your Discourse instance as a Discourse connect provider see: Using DiscourseConnect as an identity provider.

Debugging your DiscourseConnect provider

To assist in debugging DiscourseConnect you may enable the site setting verbose_discourse_connect_logging. By enabling that site setting rich diagnostics will show up in YOURSITE.com/logs. Be sure to :white_check_mark: the warnings box at the bottom of YOURSITE.com/logs.

We will log a warning to the logs with a full dump of the SSO payload:

Last edited by @MarkDoerr 2025-06-17T19:20:06Z

Check documentPerform check on document:
173 „Gefällt mir“

Hallo, ich kann nirgends etwas finden, aber welches Protokoll wird hier verwendet? Gehen wir von OAuth2 aus? Die Parameter scheinen nicht übereinzustimmen, und ich erhalte eine Fehlermeldung vom Anbieter, dass er anscheinend einen sso=-Parameter akzeptiert? Hilfe!

Danke

DiscourseConnect ist die Implementierung von SSO durch Discourse. Es verwendet kein Standardprotokoll.

Wenn es Ihnen nichts ausmacht, PHP-Code anzusehen, gibt es hier eine Beispielimplementierung: wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub.

Ja, das wird nicht funktionieren. Wenn Sie einen OAuth2-Anbieter haben, den Sie zur Authentifizierung von Benutzern verwenden möchten, schauen Sie sich das Plugin Discourse OAuth2 Basic an.

1 „Gefällt mir“

Danke @simon. Ist der PHP-Code auch ein Provider und kein Consumer? Ich habe auch einen OIDC-Provider gesehen, der funktionieren könnte, sowie einen “Mittelsmann”-Provider im Plugin-Bereich.

Wenn der SSO-Provider nicht standardmäßig ist, für wen/was ist er dann gedacht, wenn er nicht mit anderen zusammenarbeitet?

Nochmals vielen Dank!

Der Code, auf den ich verwiesen habe, dient zur Verwendung von WordPress als Authentifizierungsanbieter für Discourse.

Das WordPress-Plugin ermöglicht es WordPress auch, als DiscourseConnect-Client verwendet zu werden: wp-discourse/lib/sso-client at main · discourse/wp-discourse · GitHub.

Ich bin mir nicht sicher, was die Motivation für die Hinzufügung einer benutzerdefinierten SSO-Implementierung zu Discourse war. Ich vermute, es gab dafür einen geschäftlichen Grund.

Ein Vorteil ist, dass er es einer externen Website ermöglicht, eng in Discourse integriert zu werden. Zum Beispiel können alle hier aufgeführten Benutzerattribute während des Authentifizierungsprozesses mit Discourse synchronisiert werden: discourse/lib/discourse_connect_base.rb at 7b89fdead98606d4f47ceb0a1d240d0f6e5f589e · discourse/discourse · GitHub.

Er ermöglicht auch die Verwendung von Websites, die nicht als OAuth2- oder OpenID Connect-Anbieter konfiguriert sind, zur Authentifizierung von Benutzern auf Discourse.

Der Nachteil ist, dass benutzerdefinierter Code auf der Seite des Authentifizierungsanbieters hinzugefügt werden muss.

1 „Gefällt mir“

Hallo, ich bin neugierig, welche Probleme es gibt, E-Mail-Adressen auf einer externen Website, die SSO anbietet, nicht zu verifizieren. Ermöglicht dies nur automatisiertes Spamming? Oder gibt es andere Überlegungen? Warum wird nicht empfohlen, dass Discourse die E-Mail-Verifizierung übernimmt, wenn die externe Website dies nicht tut?

Vielen Dank für zusätzliche Einblicke.

Das schlimmste Szenario, das mir bekannt ist, erfordert diese Bedingungen:

  • E-Mail-Adressen werden auf der externen Website nicht verifiziert
  • require_activation=true ist in der SSO-Nutzlast nicht gesetzt
  • Es gibt bereits Konten auf der Discourse-Website, denen kein SingleSignOnRecord zugeordnet ist (der Kontoinhaber hat sich nie mit SSO bei Discourse angemeldet)

In diesem Fall könnte sich jemand auf der externen Website mit der E-Mail-Adresse eines Discourse-Benutzers registrieren, der sich nie mit SSO angemeldet hat. Dies würde es dem nicht verifizierten Konto von der externen Website ermöglichen, das Discourse-Konto zu übernehmen, das dieselbe E-Mail-Adresse verwendet. Dies wäre besonders besorgniserregend, wenn es sich um ein Administratorkonto bei Discourse handeln würde.

Es wird empfohlen, dass Discourse die E-Mail-Verifizierung handhabt, wenn die externe Website dies nicht tut:

Es gibt jedoch ein paar Gründe, warum es besser ist, die E-Mail-Verifizierung auf der externen Website durchzuführen:

  • Benutzer zu zwingen, die Bestätigungs-E-Mail von Discourse zu erhalten, fügt Reibung hinzu, wenn Benutzer sich zum ersten Mal bei Discourse anmelden. (Realistisch gesehen muss diese Reibung irgendwo stattfinden – entweder auf Discourse-Seite oder auf der Seite der externen Website.)
  • Discourse gleicht keine vorhandenen Discourse-Konten mit externen Anmeldungen anhand der E-Mail-Adresse ab, wenn require_activation in der SSO-Nutzlast auf true gesetzt ist. Dies ist ein Problem, wenn Sie DiscourseConnect aktivieren, nachdem einige Konten auf Discourse durch Registrierung mit Benutzername/Passwort erstellt wurden. Es ist auch ein Problem, wenn Sie aus irgendeinem Grund jemals SingleSignOnRecord-Einträge auf Discourse löschen müssen. Discourse erstellt keine neuen SingleSignOnRecord-Einträge automatisch, wenn sich Benutzer wieder bei Discourse anmelden.
4 „Gefällt mir“

Danke, @simon – das ist sehr hilfreich!

Hallo, ich habe eine Frage zum groups-Feld in der SSO-Nutzlast.

Werden automatisierte Gruppen (wie Administratoren, Moderatoren und die Vertrauensstufen) ebenfalls überschrieben? Oder werden sie beibehalten?

Nein! Wenn die Beschreibung dieser Einstellung richtig ist, werden nur manuelle Gruppen davon betroffen sein.

Weißt du was… Ich habe das Wort „manuell“ in der Beschreibung nicht gesehen. Klingt vielversprechend für meinen Anwendungsfall, ich werde es ausprobieren und mich wieder melden.

1 „Gefällt mir“

Als ich das las, dachte ich, ich müsste die Signatur direkt aus der Base64-kodierten Nutzlast generieren. Mir war nicht bewusst, dass man sie aus den UTF-8-Bytes generieren muss. Könnte das verdeutlicht werden?

Ich habe mit DiscourseConnect herumgespielt – die Dokumentation ist großartig, danke.
Ich bin jedoch auf ein paar Hindernisse gestoßen, bei denen ich hoffe, Hilfe/Klärung zu bekommen.

Wir möchten, dass sich Benutzer mit ihrem Discourse-Login bei WordPress anmelden können (das funktioniert einwandfrei :slight_smile: ) – jedoch.

  • Ist es möglich, einen WordPress-Benutzer über die Discourse-Registrierung zu erstellen (wenn ein Benutzer ein Discourse-Benutzerkonto erstellt, wird automatisch ein WordPress-Konto/Profil für ihn erstellt, damit er sich bei WordPress anmelden kann)?

  • Ist es möglich, WordPress-Benutzergruppen und Discourse-Gruppen zu synchronisieren?
    Wenn ein Benutzer sowohl ein WordPress- als auch ein Discourse-Benutzerkonto hat, kann DiscourseConnect diese verknüpfen – gibt dem WordPress-Konto aber nicht die Benutzergruppen der Discourse-Gruppen mit demselben Namen und umgekehrt (und was ist, wenn Gruppen nicht denselben Namen haben – wie kann ich DiscourseConnect sagen, dass es dem Benutzer die Benutzergruppe „Testing Group“ geben soll, wenn der Benutzer die Discourse-Gruppe „Group for Testing Things“ hat)?

Was fehlt mir?

Ich kenne die Antwort nicht, aber…

Seien Sie damit vorsichtig. Es ist irgendwo ungesetzlich und wird weithin als schlechte Praxis angesehen (außerhalb der Website-Besitzer, natürlich :smirking_face:), da dies ohne Zustimmung und Wissen des Benutzers geschehen würde und gleichzeitig Daten woandershin verschoben würden.

Sicher, das ist etwas im Graubereich und im Grunde macht Google das zum Beispiel.

Aber… warum? Beschränken Sie die Anmeldung auf der WordPress-Seite nur auf Discourse SSO und leiten Sie Benutzer zur Kontoerstellung an Discourse weiter, und das war’s. Aber soweit ich weiß, können Sie Benutzerkonten nicht sofort automatisch synchronisieren. Und warum sollten Sie, denn mit SSO geschieht dies, wenn ein Benutzer es benötigt.

In unserem Szenario (als Mitgliederorganisation)

  • WordPress wird zur Verwaltung von Abonnements und zum Kauf von Artikeln im WordPress-Store verwendet, und wir verwenden Benutzergruppen, um zu verwalten, was ein Mitglied in der Organisation tun kann.
  • Discourse ist unser Forum/unsere Online-Community, und wir verwenden Gruppen, um zu steuern, auf welche Bereiche von Discourse ein Benutzer Zugriff hat.

Derzeit muss ein neues Mitglied ein WordPress-Konto einrichten (und sein Abonnement usw. einrichten) und auch ein Discourse-Konto einrichten. Benutzergruppen-Discourse-Gruppen werden manuell verwaltet/synchronisiert.

Ich versuche, eine Lösung zu finden, bei der ein neuer Benutzer die Einrichtung einmal durchführt, um beide Konten zu erstellen, und Benutzergruppen-Discourse-Gruppen automatisch synchronisiert werden. Ich bin sicher, dass ich die Gruppensynchronisierung mit APIs usw. lösen kann. Es ist die Einrichtung mehrerer Benutzerkonten, die ich lösen/verhindern möchte.

Es scheint, als ob Sie Discourse als SSO-Anbieter für WordPress verwenden. Dieser Ansatz wird hier beschrieben: Discourse als Identitätsanbieter verwenden (SSO, DiscourseConnect). Das Discourse WordPress-Plugin bietet Optionen, entweder WordPress als SSO-Anbieter für Discourse zu verwenden oder Discourse als Identitätsanbieter für WordPress zu verwenden. Die Verwendung desselben Namens für beide Ansätze führt zu einiger Verwirrung.

Ich wäre versucht, WordPress in diesem Fall als Identitätsanbieter zu verwenden. Mit diesem Ansatz erstellen Benutzer Konten auf Ihrer WordPress-Website und melden sich dann mit ihren WordPress-Anmeldedaten bei Discourse an. Eine Sache, die Sie bei diesem Ansatz beachten sollten, ist, dass Benutzer sich nur über WordPress bei Discourse anmelden können. Es ist nicht möglich, ein Discourse-Konto zu erstellen, ohne bereits ein WordPress-Konto zu haben. Ich denke, das ist die richtige Einrichtung, wenn Sie Discourse mit einer WordPress-Mitgliederseite integrieren.

Wenn WordPress als Identitätsanbieter für Discourse verwendet wird, gibt es einige Hilfsfunktionen, die nützlich sind, um die Discourse-Gruppenmitgliedschaften von Benutzern basierend auf ihrer Aktivität in WordPress festzulegen. Diese Funktionen sind hier beschrieben: Gruppenmitgliedschaft in Discourse mit WP Discourse SSO verwalten.

Zurück zu Ihrer ursprünglichen Frage:

Es ist eine Weile her, seit ich mir den DiscourseConnect Client-Code des WordPress-Plugins angesehen habe, aber ich denke, was Sie fragen, ist mehr oder weniger die Art und Weise, wie dieser Code funktionieren soll. Wenn ein Benutzer ein Discourse-Konto hat, muss er nur auf den Link “Durch Discourse anmelden” in WordPress klicken, und ein Konto wird für ihn erstellt.

Dies wäre technisch möglich, wenn Sie WordPress als DiscourseConnect-Client verwenden, aber es sei denn, etwas hat sich geändert, können Sie die Methoden add_user_to_discourse_group und remove_user_from_discourse_group nicht verwenden, die in der von mir verlinkten Dokumentation beschrieben sind. Sie müssten etwas wie die Einrichtung eines Discourse Webhooks einrichten, der ausgelöst wird, wenn ein Benutzer zu einer Discourse-Gruppe hinzugefügt wird, und dann etwas Code in WordPress hinzufügen, um diesen Webhook zu verarbeiten. Um Gruppen von WordPress nach Discourse zu synchronisieren, müssten Sie einen API-Aufruf an Discourse machen, um die Gruppen eines Benutzers zu aktualisieren, wenn es eine Änderung in WordPress gab. Etwas, das ziemlich einfach zu erreichen wäre, wenn Sie WordPress als DiscourseConnect-Anbieter verwenden, könnte etwas komplizierter sein, wenn Sie WordPress als DiscourseConnect-Client verwenden.

1 „Gefällt mir“

Außer wenn eine benutzerdefinierte Anmeldung verwendet wird, wie es normalerweise bei WooCommerce/Mitgliedschaften/LLM der Fall ist, die diese Schaltfläche anzeigen und die ausschließliche Verwendung von Discourse SSO als Anbieter nicht standardmäßig erfolgt und etwas benutzerdefinierte Arbeit erfordert.

Es gibt ein paar mögliche Probleme, eines im Zusammenhang mit Caching und ein anderes im Zusammenhang mit Login-Weiterleitungen, die von einigen Plugins hinzugefügt werden. Jeder, der auf diese Probleme stößt, sollte sie in der Kategorie Support > WordPress ansprechen. Sie sind normalerweise leicht zu lösen.

Ich habe ganz vergessen, zurückzumelden: Tatsächlich funktioniert es genau wie beschrieben, nur manuelle Gruppen sind betroffen.

Hallo @simon,
Ich glaube, ich brauche wirklich Hilfe bei der 404-Antwort meines POC-Explorers dieser SSO-Funktion. Ich arbeite seit einem ganzen Tag an diesem Problem, kann aber immer noch nicht herausfinden, was das Problem ist. Ich konnte

  1. discourse_connect aktivieren
  2. die discourse_connect_url auf https://localhost:4200/login setzen
  3. discourse-connect secret: 20’s (1) 1111111111111111111 um es einfach zu halten

dann auf meiner Login-Seite meiner Angular-App habe ich diese Anfrage mit dem folgenden Code gesendet:


aber ich habe die Antwort 404 nicht gefunden erhalten.

Nach meinem Verständnis sollte beim Senden einer POST-Anfrage an den Endpunkt admin/users/sync_sso, wenn der Benutzer nicht in Discourse existiert, ein neuer Benutzer basierend auf der user_id und der E-Mail erstellt werden. Das zurückgegebene Ergebnis sollte ein Benutzerobjekt sein und kein leeres Objekt mit dem Statuscode 404.
Ich habe auch das Protokoll überprüft, es lieferte keine relevanten Informationen für diese fehlgeschlagene Antwort.

Vielen Dank im Voraus!