Automatische Anmeldung mit dem OpenId Connect-Plugin und AWS Cognito

Hallo. Ich bin brandneu bei Discourse. Ich habe eine App, die auf AWS läuft und Cognito zur Authentifizierung verwendet. Ich möchte diese App mit meinem neuen Discourse-Forum verbinden, das gehostet wird. Ich habe einen guten Start gemacht, aber ich hoffe, dass mir jemand bei den letzten Schritten helfen kann.

Das Ziel ist es, die Anmeldung zwischen meiner App und dem Discourse-Forum nahtlos zu gestalten. Also:

  • Wenn ein Benutzer in meiner App angemeldet ist, erkennt Discourse dies, wenn er zum Discourse-Forum geht, und verlangt keine erneute Anmeldung.

  • Ebenso, wenn ein Benutzer zuerst das Discourse-Forum besucht und nicht angemeldet ist, leitet Discourse ihn zur Anmeldeseite meiner App weiter (oder zu einer gehosteten Login-Oberfläche, falls nötig).

Das OpenId Connect-Authentifizierungs-Plugin scheint dafür gut geeignet zu sein. Ich habe mich für einen Business-Plan bei Discourse angemeldet, um sicherzustellen, dass ich dieses Plugin nutzen kann.

Ich habe die Anweisungen von @david durchgearbeitet und das, was ich als Einrichtung auf der Cognito-Seite betrachte, durchgeführt:

  1. Von Cognito habe ich das „OpenID Connect Discovery-Dokument" und die „OpenID Connect-Client-ID" erhalten.

  2. In meinen Discourse-Einstellungen unter openId_Connect habe ich diese hinzugefügt und gespeichert.

  3. Ich habe „OpenID Connect-Authentifizierung aktivieren" aktiviert und unter „OpenID Connect-Autorisierungsbereich" „openid email" eingegeben. Diese Einstellungen habe ich gespeichert.

Laut der Plugin-Beschreibung sollte das jetzt funktionieren, oder?

Nun, wenn ich mich in meiner App anmelde und dann zu meinem Forum gehe, passiert nichts. Es wird einfach die normale Startseite mit den Schaltflächen „Anmelden" und „Registrieren" angezeigt. Ich hoffe, dass es mich nach der Überprüfung bei Cognito automatisch anmeldet, aber das tut es nicht. Was muss ich noch tun?

Zusätzlich sollten Benutzer, die frisch auf die Forum-Seite kommen (ohne sich jemals in meiner App angemeldet zu haben), die Discourse-Schaltflächen „Registrieren" und „Anmelden" nicht sehen – stattdessen sollten sie eine Schaltfläche sehen, auf die sie klicken können, um zur Anmeldeseite meiner App weitergeleitet zu werden. Wie füge ich diese hinzu?

Und schließlich abonnieren Benutzer meine App und zahlen für Premium-Funktionen. Dies wird als benutzerdefiniertes Attribut für den Benutzer in Cognito gespeichert (es gibt ein benutzerdefiniertes Attribut, das „Abonniert" oder „Nicht abonniert" angibt). Nur abonnierte Benutzer sollten auf dem Forum posten dürfen. Wenn Discognito also mit Cognito kommuniziert, um die Benutzerinformationen zu erhalten, muss es das benutzerdefinierte Attribut des Benutzers prüfen und nur dann, wenn der Benutzer abonniert ist, ihm die Möglichkeit zum Posten geben. Wie mache ich das?

Da ich bei Discourse noch so neu bin, wäre ich für alle Informationen, die jemand zu diesen Fragen hat, sehr dankbar. Danke!

Hallo @JQ331 :wave:

Die automatische Anmeldung wird nur unterstützt, wenn Ihre Seite privat ist (die Site-Einstellung login_required aktiviert ist).

Das sollte bereits so funktionieren. Stellen Sie sicher, dass Sie alle anderen Anmeldeverfahren deaktivieren, einschließlich „lokale Anmeldungen“.

Leider ist dies mit dem OIDC-Plugin nicht möglich.

@david, vielen Dank für deine Antwort. Das ist hilfreich.

Wo finde ich diese Site-Einstellung „login_required

In diesem Fall ist die automatische Anmeldung derzeit nicht unterstützt. Benutzer müssen auf die Anmelde- Schaltfläche klicken.

Ok, dann sollte der Anmelde-Link nun direkt zu deinem Identitätsanbieter führen. Funktioniert das?

Ja, du kannst alle Kategorien so einstellen, dass „jeder" lesen kann. Aber nur Benutzer in einer bestimmten Gruppe können Themen erstellen oder antworten. Wenn du das automatisieren möchtest, könntest du die API verwenden, um Personen zu einer Gruppe hinzuzufügen oder daraus zu entfernen.

Cool – sieht so aus, als wäre ich schon ziemlich nah dran. Nur zur Bestätigung:

Ich möchte Folgendes erreichen:

  1. Jeder kann den Seiteninhalt lesen (eingeloggt oder nicht).
  2. Nur eingeloggte Benutzer können Beiträge verfassen.
  3. Wenn du in meiner App eingeloggt bist und zu Discourse gehst, wird mit Cognito kommuniziert und du wirst automatisch eingeloggt, sodass du Beiträge verfassen kannst.

Meinst du also, dass (3) nicht möglich ist? Sagst du, dass die automatische Anmeldung nur funktioniert, wenn der Seiteninhalt für die Öffentlichkeit unsichtbar ist?


[quote=“david, post:4, topic:145170”]
Ja, du könntest alle deine Kategorien so einstellen, dass „jeder

Ich denke, wir haben vielleicht unterschiedliche Definitionen von „automatischer Anmeldung".

Discourse kann sich mit einem OIDC-Anbieter für die Anmeldung verbinden. Dieser Prozess wird gestartet, wenn der Benutzer auf die Schaltfläche „Anmelden" im Forum klickt. Dies funktioniert immer, unabhängig von der Konfiguration.

Wenn eine Seite eine Anmeldung erfordert (d. h. die Einstellung „Anmeldung erforderlich" aktiviert ist), wird der Benutzer direkt zum OIDC-Anmeldebildschirm weitergeleitet, ohne dass er auf die Schaltfläche klicken muss.

Ja, genau das habe ich gemeint. Hier ist eine Dokumentation zu diesem API-Endpunkt.

Cool. Danke! Ich werde mir die API-Dokumentation ansehen. Klingt sehr vielversprechend.

Zum Thema „Auto-Login

Es ist technisch im OIDC-Spezifikation möglich, aber leider unterstützt Discourse dies derzeit nicht.

Hmm. Ich habe gehört, dass es zwei Möglichkeiten gibt, eine Verbindung zwischen Discourse und einem separaten Authentifizierungsanbieter wie Cognito herzustellen: das OpenId-Plugin oder die Verwendung von Single Sign On für Discourse.

Mir ist der Single-Sign-On-Prozess überhaupt nicht vertraut, aber könnte das ein Weg sein, um zu erreichen, was ich möchte – nämlich zu vermeiden, dass sich Benutzer zweimal anmelden?

Oder vielleicht einfach, wenn sie sich in meiner App anmelden, einen API-Aufruf an Discourse zu senden und sie so anzumelden?

(Die von mir verlinkte Dokumentation spricht auch von der Angabe von Gruppenmitgliedschaften – ich gehe davon aus, dass dies das bewirken würde, was ich möchte, indem festgelegt wird, dass NUR BEZAHLTE Benutzer in der Gruppe sein können, die zum Posten berechtigt ist.)