Gültigkeit von SSO-Anmeldedaten / erzwungene Abmeldung

Welche Erwartungen sollte ich hinsichtlich der Dauer haben, für die ein Benutzer eingeloggt bleiben kann, bevor er erneut zur Anmeldung aufgefordert wird?

Ich habe meine eigene Überprüfung in functions.php implementiert und dabei das SSO-Plugin für WordPress integriert. Meine Logik scheint recht einfach zu sein, aber mir ist aufgefallen, dass ein Mitglied, dessen Kreditkarte abgelehnt wurde (wodurch der von meiner Logik geprüfte Benutzer-Tag entfernt wurde), heute trotzdem Zugriff auf mein Forum hatte. Bei genauerer Überprüfung stellte sich heraus, dass sie sich vor ein paar Tagen das letzte Mal angemeldet hat und anscheinend immer noch eingeloggt ist. Ihr letzter Anmeldezeitpunkt in WordPress liegt ebenfalls einige Tage zurück.

Ist es zu erwarten, dass ihre zwischengespeicherten Anmeldeinformationen noch funktionieren? Falls ja, gibt es eine Möglichkeit, die Gültigkeit des Tokens zu steuern und/oder auf einen Webhook zu reagieren, um eine Abmeldung zu erzwingen?

Vielen Dank.

Dies wird durch die Discourse-Siteeinstellung „maximale Sitzungszeit“ gesteuert. Sie legt die Anzahl der Stunden fest, für die Benutzer auf Ihrer Site eingeloggt bleiben. Der Standardwert beträgt 1440 Stunden (60 Tage). Sie könnten versuchen, diesen Wert niedriger einzustellen. Wenn Sie ihn zu niedrig setzen, könnte es für Ihre Benutzer wie ein Fehler wirken.

Das ergibt Sinn. Sie können Benutzer manuell ausloggen, indem Sie auf die Discourse-Admin-Seite des Benutzers gehen und auf die Schaltfläche „Abmelden“ klicken, die Sie oben rechts auf der Seite sehen. Eine weitere Option zur Steuerung dieses Vorgangs wäre, Code zu Ihrer WordPress-Site hinzuzufügen, der Benutzer automatisch aus Discourse ausloggt, wenn eine Mitgliedschaft abläuft.

Sehr geschätzt, Simon. Zwar halte ich 60 Tage für meine Szenarien für zu lang (es handelt sich um zahlende Mitglieder, die daher erwarten, dass wir prüfen, ob sie noch gültige Mitglieder sind), doch stimme ich zu, dass eine zu starke Verkürzung lästig sein kann.

Der letzte Vorschlag (eine Möglichkeit finden, sie automatisch aus Discourse auszuloggen, wenn die Mitgliedschaft endet), ist das, was ich untersuchen werde. Ich hatte die manuelle Abmeldeoption gesehen, aber da ich alles vollständig automatisieren möchte, scheint dies der richtige Weg zu sein.

Nochmals vielen Dank.

Hmm… die Beschreibung der Siteeinstellung besagt (meine Hervorhebung):

Der Benutzer bleibt n Stunden seit dem letzten Besuch eingeloggt.

Wenn ich das richtig verstehe, könnte ein Benutzer also für immer eingeloggt bleiben, solange er die Seite regelmäßig besucht, selbst nachdem er seine SSO-Anmeldeinformationen verloren hat. Wenn die Einstellung beispielsweise auf 72 Stunden gesetzt ist, bleibt er so lange eingeloggt, wie er die Seite alle ein oder zwei Tage besucht. Habe ich das richtig interpretiert?

Ja, das entspricht meiner Erfahrung. Es gibt keine feste Zeitbegrenzung, die jemanden nach einer bestimmten Zeitspanne zwangsweise abmeldet.

Bedeutet das also, dass ich, wenn jemand meine Mitgliedschaft kündigt und ich sicherstellen möchte, dass er keinen Zugriff mehr auf mein Forum hat, diese Person zwangsweise abmelden muss (manuell oder über einen API-Aufruf)?

Ja, das ist die Empfehlung.

Vielen Dank. Da ich gerade von einer Facebook-Gruppe gewechselt bin (bei der ich Mitglieder manuell entfernen musste, wenn sie ihre Abonnements gekündigt hatten), ist es bedauerlich, dass ich bei Discourse immer noch einen manuellen Prozess benötige, um sicherzustellen, dass gekündigte Mitglieder keinen Zugriff auf mein Forum haben. Das wirft eine Frage auf.

Gibt es einen nicht-manuellen Mechanismus – wie kreativ auch immer –, mit dem ich sicherstellen kann, dass ein Benutzer, der kein gültiges Konto mehr hat (d. h. sich nicht anmelden kann), zwangsweise von Discourse abgemeldet wird?

Es erscheint logisch seltsam, dass der SSO-Mechanismus Benutzer daran hindert, sich anzumelden (da er erkennt, dass sie kein gültiges Konto haben), aber wenn sie das Forum regelmäßig nutzen (innerhalb des Timeout-Zeitraums), können sie so lange darauf zugreifen, bis ich sie manuell abmelde.

Meine letzte Option wäre möglicherweise, ein Plugin zu schreiben, das über die Discourse-API eine Abmeldung auslöst, wenn ein Benutzer sein Abo kündigt.

Ich bin für jede und alle Ideen offen. Wie Sie sehen, möchte ich wirklich vermeiden, dies manuell erledigen zu müssen :slight_smile:

Vielen Dank.

Sie können eine API-Anfrage an /admin/users/<discourse_user_id>/log_out senden. Das WP Discourse-Plugin verwendet diese Route, um die Abmeldung von WordPress mit Discourse zu synchronisieren. Sie könnten wahrscheinlich den größten Teil des Codes aus dieser Funktion kopieren: wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub.

Sehr dankbar, Simon. Ich werde mir das ansehen.

Wenn man jedoch einen Schritt zurücktritt, erscheint das nicht wie ein Problem? Ich denke, wir können über die Wichtigkeit davon diskutieren, aber eine Plattform, auf der Benutzer endlos auf ein Forum zugreifen können, selbst wenn sie keinen gültigen Account mehr haben, habe ich nirgendwo sonst gesehen.

Ich kann vielleicht die Vorstellung akzeptieren, dass WordPress und nicht Discourse hier die autoritative Quelle ist. Das weist also wahrscheinlich auf das SSO-Plugin als den besten Ort hin, um einige Logik zu platzieren.

Bin gespannt auf die übergeordneten Überlegungen hier. Ich würde gerne glauben, dass dieses Szenario gültig ist (Abmeldung nach einer bestimmten Zeitspanne oder basierend darauf, dass ein WordPress-Account „ungültig

Ja, dies muss von WordPress übernommen werden. Ich denke, es wäre sinnvoll, wenn das WP Discourse-Plugin Benutzer bei einer Löschung in WordPress auch in Discourse abmeldet. Ich bin mir jedoch nicht sicher, ob dies Ihr Problem lösen würde. Meine Annahme ist, dass ein Benutzer nicht von Ihrer WordPress-Seite gelöscht wird, wenn dessen Mitgliedschaft auf Ihrer Seite abläuft. Um den Fall zu behandeln, dass ein Benutzer abgemeldet wird, wenn dessen Mitgliedschaft abläuft, müssen Sie wahrscheinlich etwas Code zu Ihrer Seite hinzufügen, der an die Aktion anbindet, die von Ihrem Mitgliedschafts-Plugin ausgelöst wird, wenn eine Mitgliedschaft abläuft.

Nochmals vielen Dank, @simon. Deine Punkte ergeben Sinn, aber bitte entschuldige, wenn ich noch einen weiteren Durchgang mache :slight_smile:

Es scheint, als gäbe es hier zwei Faktoren: die Gültigkeit eines Kontos (nämlich, ob es sich um ein aktives Mitglied handelt) und die Gültigkeit eines Tokens in Discourse.

Bei Ersterem stimme ich absolut zu, dass WordPress dafür verantwortlich sein sollte, und ich werde dies, sobald die Zeit es zulässt, untersuchen.

Allerdings stellt sich auch die Frage nach einem aktiven/gültigen Token auf der Discourse-Seite. Ich verstehe, dass dies möglicherweise keine hohe Priorität hat, aber ich erkenne eine gewisse Logik in einer Option (die wahrscheinlich standardmäßig deaktiviert ist), die einen Zeitraum für eine erzwungene Anmeldung vorsieht, d. h. nach x Tagen läuft das Anmelde-Token des Benutzers ab, unabhängig davon, ob er/sie kürzlich angemeldet war.

Wiederum bin ich hier nur beim Brainstorming, kann aber einen gewissen Nutzen darin sehen, eine erzwungene Abmeldung als Option unabhängig davon anzubieten, ob der Benutzer ein gültiges Konto hat.

Ich versuche, dies über einen Web-Link zu erledigen, da ich WordPress nicht verwende. Sollte das mit so etwas wie diesem funktionieren?

https://community.mysite.com/admin/users/100004/log_out

Bei mir erscheint ein 404-Fehler, und der Benutzer wird nicht ausgeloggt.

Wenn ich eine URL zum Funktionieren bringen kann, hoffe ich, einen Logout mit einem curl- oder file_get_contents-Befehl in PHP erzwingen zu können…

Sie müssen eine authentifizierte POST-Anfrage an die Route senden. Sie könnten dies so einrichten, dass Benutzer beim Klicken auf einen Link ausgeloggt werden, müssen die Anfrage jedoch auf dem Server verarbeiten.

Danke! Authentifiziert, hm? Ich recherchiere gerade dazu. Es sieht so aus, als würde ein authentifizierter Post aus PHP so etwas wie diesen Inhalt im Header senden:

'Authorization: OAuth '.$accesstoken;

Es gibt einige Hinweise, an denen ich weiterforschen werde.

Aber es wäre großartig, wenn jemand ein funktionierendes PHP-Code-Snippet hätte! Das Beispiel im Authentifizierungsbereich unter https://docs.discourse.org/ wirft bei mir einen Syntaxfehler auf… oh warte, das ist ein Unix-Befehl!

Ich freue mich über alle Hinweise, die für PHP helfen!

Der Link aus meinem vorherigen Beitrag sollte ausreichen, um dir den Einstieg zu erleichtern: wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub. Wenn du die Anfrage nicht von einer WordPress-Website aus stellst, musst du einen anderen Weg finden, um die wp_remote_post-Anfrage durchzuführen.

Ich glaube, ich bin nah dran, mit einfachen PHP-Befehlen. Der Code ist unten. Die Wahl des Benutzernamens stammt aus diesem Beitrag.

Ich erhalte diese Antwort… sagt das jemandem etwas? Sieht nach einem SSL-Protokollversion-Problem aus?

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

Hier ist mein Code:

    $url = "https://community.mysite.com/admin/users/100004/log_out";
    $headers = array( 'Api-Key' => 'd412mylongadminkeyaadcd',
    				  'Api-Username' => 'system',
    				  );

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);

[edit: habe diese Zeilen auch hinzugefügt, keine Änderung:]
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
[/edit]

	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $data = curl_exec($ch);
    if (curl_errno($ch)) {
        echo curl_error($ch);
    }
    curl_close($ch);

Da du WordPress verwendest, könntest du versuchen, die Anfrage mit der Funktion wp_remote_post durchzuführen. So musst du dich nicht mit den curl-Optionen auseinandersetzen.

Danke, aber ich verwende kein WordPress. Ich versuche, dies in PHP in einem Mitgliedschaftsmanager umzusetzen, den ich selbst über das letzte Jahrzehnt entwickelt habe.

Es sieht so aus, als hätte deine PHP-Bibliothek dein Discourse-HTTPS-Zertifikat nicht akzeptiert. Ich würde nach diesem Fehler googeln.