Wir nutzen Discourse als Kollaborationstool und haben eine andere App zur Dokumentensuche. Wir möchten Kommentare zu Dokumenten in Discourse integrieren. Beide Systeme verwenden einen externen SSO/OAuth-Provider innerhalb unserer Infrastruktur.
Wir verwenden den User API Key, um die beiden Apps zu verbinden, damit sie miteinander kommunizieren können. Das funktioniert zwar, aber wir müssen das Formular „Anwendungszugriff autorisieren
Ich kann mit Sicherheit sagen, dass dies nicht der richtige Weg ist. Verwenden Sie bereits ein Plugin oder interagieren Sie nur über HTTP?
Wenn Sie ein Plugin verwenden, sollten Sie in der Regel nicht mit Instanzen von app/controllers/ interagieren.
Wenn Sie über HTTP interagieren und Server-zu-Server-Kommunikation verwenden, wären Sie mit einem von einem Administrator erstellten API-Schlüssel besser bedient.
Die User-API ist für Client-zu-Server-Kommunikation gedacht, bei der keine Möglichkeit besteht, die Code-Integrität auf der Client-Seite sicherzustellen.
Ja, wir planen, ein Discourse-Plugin zu entwickeln, und unsere JS-App wird ausschließlich über HTTP-Anfragen interagieren.
Wir möchten vermeiden, eine Server-zu-Server-Kommunikation (z. B. mit Hilfe eines Admin-API-Schlüssels) aufbauen zu müssen, um die Kopplung zwischen den Komponenten zu minimieren.
Ich verstehe, dass wir idealerweise nicht in Discourse-Controller eingreifen sollten. Gleichzeitig gibt es jedoch viele Methoden, die offenbar zum Überschreiben konzipiert sind (Template-Methoden-Muster und andere Erweiterungspunkte), und soweit wir bisher gesehen haben, nutzen viele Plugins genau das.
Wenn du ein Plugin entwickelst, solltest du neue Routen in einem plugin-gebundenen Controller erstellen, die die erforderlichen Aufgaben direkt ausführen. Diese Routen können alle eine before_action teilen, die die Antwort-Header Access-Control-Allow-{Origin, Headers, Credentials} setzt (spiegele den Origin-Anfrage-Header wider, wenn er in der Liste der Domains enthalten ist, auf denen deine App laufen soll).
Auf diese Weise kann dein JS-Code einfach fetch(..., { credentials: "include", ...}) ohne API-Schlüssel aufrufen.
Danke @riking, das funktioniert gut, wenn im Browser eine offene Discourse-Sitzung vorhanden ist.
Wir können eine neue Sitzung manuell starten, indem wir einfach http://discourse_site/login aufrufen, da SiteSetting.enable_local_logins = false gesetzt ist und wir nur einen Authentifizierungsmechanismus mit OAuth verwenden. Der Browser folgt den Weiterleitungen unseres OAuth-Anbieters und leitet dann zu Discourse weiter. Genau das geschah im Hintergrund, als /user-api-key/new aufgerufen wurde.
Wie könnten wir eine neue Discourse-Sitzung programmgesteuert aus der App heraus starten, falls keine vorhanden ist?