ich habe ein Problem beim Einbetten von Discourse in unsere Intranet-Website.
Laut der API-Dokumentation erfordert die Discourse-Anfrage die Header „API-Key“ und „Api-Username“ zur Authentifizierung und zum Zugriff auf den Feed. Die Pre-Flight-Prüfung besagt jedoch, dass „User-API-Key“ und „User-Api-Client-Id“ die zulässigen Werte sind.
Wenn die Anfrage nicht über einen Browser erfolgt, funktioniert dies wie erwartet. Bei Aufruf über den Browser gibt der Server jedoch an, dass „User-API-Key“ und „User-Api-Client-Id“ erforderlich sind.
Ich habe mit Postman überprüft, dass die grundlegende Verbindung funktioniert; dies verhält sich entsprechend der Discourse-Dokumentation.
Wenn wir die Header aus der Dokumentation übergeben, blockiert der Browser die Anfrage aufgrund der Pre-Flight-Prüfung und es tritt ein CORS-Fehler mit Access-Control-Allow-Headers auf.
Wenn wir die Header übergeben, die der Server akzeptiert, erhalten wir einen „nicht autorisierten Fehler“, da die Anwendung anders benannte Werte erwartet.
Ich habe versucht, Header in die Docker-Konfiguration hinzuzufügen, aber dies scheint keine Wirkung zu haben. CORS ist aktiviert und der Ursprung ist in der Konfiguration auf „*“ gesetzt.
Wir haben zwei verschiedene API-Authentifizierungssysteme, was verwirrend sein kann.
Diese sind für die „Admin-API“ vorgesehen, die auf docs.discourse.org beschrieben wird. Sie ist nicht dafür ausgelegt, von JavaScript-Clients verwendet zu werden.
Diese stammen aus der „User-API“-Spezifikation, die von einem JavaScript-Client verwendet werden kann (und daher CORS unterstützt). Weitere Details dazu finden Sie hier: User API keys specification
@david Ich verwende SSO und möchte den Benutzer bei Discourse ausloggen, wenn er sich aus der App ausloggt. Derzeit nutze ich die ‘Admin-API’, um die Benutzer-ID über /users/by-external/${id}.json abzurufen, aber ich bekomme CORS-Fehler. Ich möchte die ‘User-API’ nicht für jeden Benutzer nur für diesen Ausloggvorgang aktivieren. Was empfiehlst du?
Wer stellt die Admin-API-Anfrage? JavaScript in Ihrer Client-Anwendung?
Sie sollten keine Admin-API in einem JavaScript-Client einbinden, da dies bedeutet, dass jeder, der den Client verwendet, Administratorzugriff auf Ihre Website erhalten könnte.
Ja, in meiner App ist es JavaScript. Ich verstehe. Was ist also die Alternative? Kann ich eine ‘User API’ für einen Benutzer hinzufügen und diese verwenden, um den Aufruf für alle Benutzer durchzuführen?
Wenn Sie die User-API verwenden, sollten Sie dies pro Benutzer tun. Sie sollten Schlüssel nicht teilen.
Die gängigste Lösung hier wäre jedoch, dies serverseitig in Ihrer Anwendung zu handhaben. Ihr Server kann eine Anfrage mit Admin-API-Schlüsseln senden, ohne CORS-Probleme und mit weniger Sicherheitsbedenken (sofern es sicher implementiert ist).
Hallo @david, ich habe versucht, eine Backend-Lösung zu implementieren. Wenn ich https://example.com/users/by-external/{EXTERNAL_USER_ID}.json?api_key={DISCOURSE_API_KEY}&api_username=system aufrufe, erhalte ich jedoch die HTML-Seite für die Anmeldung (ich vermute, es wird dorthin weitergeleitet). Die Einstellung „Anmeldung erforderlich“ ist aktiviert, und wenn ich sie deaktiviere, erhalte ich die korrekte JSON-Antwort. Ich möchte diese Einstellung jedoch aktiviert lassen – hast du eine Idee, was da los ist?