Ich habe ein funktionierendes Discourse-Forum, in dem Benutzer einen lokalen Login (Benutzername + Passwort) erstellen können.
Ich möchte deren Login und Passwort in einer anderen Anwendung wiederverwenden. Mit anderen Worten: Benutzer würden ihren Benutzernamen und ihr Passwort in der anderen Anwendung eingeben, und die Anwendung sollte überprüfen können, ob dies ein gültiger Login für das Forum ist.
Ich habe die Dokumentation für die Discourse API gelesen. Vieles ist möglich, einschließlich der Festlegung von Benutzername und Passwort für einen bestimmten Benutzer, aber ich habe keinen API-Endpunkt gefunden, um einen vorhandenen Benutzernamen und ein Passwort gegen die Liste der Forum-Benutzer zu validieren.
Ich gehe davon aus, dass ein solcher API-Endpunkt existieren muss, da das Forum dies tun können muss, um einen Benutzer über die Weboberfläche anzumelden.
Was ist der API-Endpunkt, um einen Benutzernamen und ein Passwort zu überprüfen, um sich im Forum anzumelden?
Direkter gesagt, Sie könnten DiscourseConnect als Mechanismus zur Benutzervalidierung verwenden oder vor Ihrer Anwendung den discourse-auth-proxy einsetzen.
Dies sind vorgeschlagene Methoden zur Authentifizierung von Benutzern, anstatt Anmeldedaten direkt zu verarbeiten. Es bedeutet auch, dass Sie sich nicht mit 2FA-Details befassen müssen.
Tatsächlich ist meine „andere Anwendung“ eine Desktop-App und keine Web-App. Ich glaube nicht, dass discourse-auth-proxy in diesem Fall funktionieren wird.
Viele Websites, die eine Integration mit einer Discourse-Site wünschen, möchten die gesamte Benutzerregistrierung auf einer separaten Website beibehalten. In einer solchen Konfiguration sollten alle Anmeldevorgänge an diese andere Website ausgelagert werden.
Dies ist genau das Gegenteil von dem, was ich tun möchte: Ich möchte alle Anmeldevorgänge an Discourse auslagern. Gibt es eine Möglichkeit, DiscourseConnect dafür zu verwenden?
Das knifflige daran ist, dass es ein gemeinsames Geheimnis zwischen dem Anbieter (Discourse) und dem Konsumenten (Ihre App) gibt. Wenn Sie Ihre App verteilen, haben Benutzer Zugriff auf alle Geheimnisse darin.
Das Platzieren eines Auth-Proxys vor einem benutzerdefinierten minimalen Webdienst, der Ihrer App einen signierten Token gibt, könnte gut funktionieren.
Ich bin sicher, es gibt andere Wege, an die ich gerade nicht denke.
Beziehen Sie sich auf den API-Schlüssel? Es scheint möglich zu sein, einen „granularen“ API-Schlüssel zu erstellen, der nur Zugriff auf bestimmte API-Endpunkte hat. Es ist mir immer noch nicht klar, welche Endpunkte erforderlich wären, wenn ich diesen Ansatz verwende. Wissen Sie das?
Ja, ein minimaler Webdienst mit Auth-Proxy könnte eine gute Lösung sein; Ich muss ein wenig experimentieren, um das herauszufinden.
Nicht genau – es wäre der Wert discourse connect provider secrets für die Anwendung, der in Verbindung mit enable discourse connect provider gesetzt werden müsste.
Wenn ich das richtig verstehe, würde diese Methode bedeuten, dass sich der Benutzer über einen Browser anmeldet. Das kann funktionieren, obwohl ich auf eine Methode gehofft hatte, bei der Benutzername und Passwort in unserer Desktop-Anwendung eingegeben werden können, ohne einen Browser zu öffnen.
Ich verstehe, dass der von mir angedachte Ansatz TFA nicht unterstützt, es sei denn, ich implementiere ihn selbst, und dass er keine Anmeldungen über Drittanbieter (Google, Facebook, Discord, …) unterstützt.
Ich glaube nicht, dass dies explizit unterstützt wird, aber ich würde eine Sitzung auf die gleiche Weise erstellen, wie der Benutzer es im Webbrowser tun würde:
Soweit ich das im Moment verstehe, sieht es so aus, als ob die im Beispiel für Reactive Native verwendete Methode auf unsere Desktop-Anwendung (die in Python geschrieben ist) übertragen werden kann.
Der verwendete API-Zugangspunkt scheint <site>/session zu sein und erfordert einen Benutzernamen, ein Passwort und ein CSRF-Token. Das CSRF-Token kann von <site>/session/csrf bezogen werden.
Das kommt dem, was ich gesucht habe, sehr nahe. Ich denke, ich werde das versuchen und melde mich, wenn es bei mir funktioniert.
Ist der API-Zugangspunkt <site>/session irgendwo dokumentiert?
Der beste Weg, um das zu erreichen, was Sie in einer Desktop-App möchten, ist die Verwendung von User API Keys.
Sie benötigen zwar eine Weboberfläche, entweder in der App oder durch Öffnen des Browsers, aber wenn Sie Ihre App zu einem Handler für das von den mobilen Apps verwendete Protokoll machen, können Sie den Token auf diese Weise leicht erhalten und müssen den Browser nur wieder verwenden, wenn der Token abläuft oder sie ein anderes Gerät verwenden.
Meine persönliche Erfahrung damit ist, dass die Verwendung von User API Keys eine viel sicherere und einfachere Option ist, als zu versuchen, die Session-Endpunkte zu verwenden.
Hier sind 20 Zeilen Python-Code, die ungefähr das Gleiche tun wie der von @renato erwähnte React Native-Code (außer dass keine Kompatibilität mit Discourse 2.5 besteht – das brauche ich nicht)
Es funktioniert gut, vorausgesetzt, Sie verwenden die grundlegende Anmeldung per Benutzername und Passwort. Ich werde mich trotzdem mit alternativen Methoden befassen, die die in der Discourse-Instanz konfigurierte Discourse SSO-Anmeldung verwenden.
Ich habe versucht, dies anzuwenden, aber es funktioniert nicht. Unten ist ein (vereinfachter) Python-Code, der eine URL für .../session/sso_provider generiert. Wenn ich es versuche, erhalte ich Login Error. Keine Ahnung, was das bedeutet.
Als Administrator, aktiviere verbose discourse connect logging, probiere es aus, und überprüfe dann /logs auf deinem Forum, um detailliertere Fehler zu sehen, z.B. https://forum.embeetle.com/logs
Übrigens, du musst dieses Geheimnis sofort widerrufen und ändern, da jeder, der es hat, sich in deine App einloggen kann, wie ich es gerade beim Testen getan habe.