Discourse verfügt über ein System zur Erstellung von API-Schlüsseln pro Benutzer, wenn ein sehr spezifisches Protokoll befolgt wird. Diese Funktion ermöglicht den „Anwendungs“-Zugriff auf Discourse-Instanzen, ohne dass Moderatoren einbezogen werden müssen.
Überblick
Im Überblick:
- Client (Desktop-App, Browser-Plugin, mobile App) generiert ein privates/öffentliches Schlüsselpaar und eine Rückruf-URL
- Client leitet zu einer Route auf Discourse um und übergibt Discourse seinen öffentlichen Schlüssel
- Discourse holt die Zustimmung des Benutzers zur Verwendung der App ein
- Discourse generiert einen Benutzer-API-Schlüssel
- Discourse leitet mit einem verschlüsselten Payload unter Verwendung des öffentlichen API-Schlüssels, der den Benutzer-API-Schlüssel enthält, zur Rückruf-URL zurück
Details
Anwendungsfälle:
- Desktop-Anwendungen, die Discourse-Seiten im Auftrag von Endbenutzern abfragen, um Benachrichtigungszähler über mehrere Websites hinweg abzurufen.
- Mobile Anwendungen, die Discourse-Seiten im Auftrag von Endbenutzern abfragen und Push-Benachrichtigungen verarbeiten
- Webanwendungen, die ein Dashboard für Endbenutzer zu verschiedenen Discourse-Seiten bereitstellen.
- Benutzerdefinierte Integrationen mit Apps von Drittanbietern, die Discourse als Teil einer allgemeinen Unternehmens-App nutzen. Z. B. die Integration von Discourse-Community-Benachrichtigungen in die Hopscotch-App.
Das Design:
Website-Einstellungen
-
allow_user_api_key_scopes: Zulässige Zugriffsbereiche (Scopes) für Benutzer-API-Schlüssel. Die Scopes sind hier definiert. Die verfügbaren integrierten Scopes sind:
read,write,message_bus,push,one_time_password,notifications,session_info,bookmarks_calendar,user_status(Plugins können zusätzliche Scopes registrieren). -
user_api_key_allowed_groups: steuert, welche Gruppen Benutzer-API-Schlüssel generieren dürfen (standardmäßig Administratoren, Moderatoren und trust_level_0)
-
allowed_user_api_push_urls: Liste der Websites, die Ziele für Push-Benachrichtigungen sein können
-
allowed_user_api_auth_redirects: zulässige Weiterleitungsziele nach der Generierung des Benutzer-API-Schlüssels
Globale Einstellungen
- max_user_api_reqs_per_minute: 20
- max_user_api_reqs_per_day: 2880
UX-Elemente
Wenn Benutzer-API-Schlüssel erteilt wurden, zeigt Discourse einen Tab Apps auf der Benutzerseite an.
Der Tab Apps listet auf:
- Der Name der Anwendung, z. B. („Discourse Notifier“)
- Datum der letzten Nutzung
- Genehmigungsdatum
- Liste der gewährten Zugriffsbereiche
- Eine Schaltfläche Zugriff widerrufen, damit Sie alle Schlüssel einfach widerrufen können
UI zur API-Schlüssel-Autorisierung
Jeder Schlüssel muss von den Endbenutzern auf einer Seite, die klar erklärt, was vor sich geht, explizit autorisiert werden, zum Beispiel:
„Discourse Notifier“ bittet um den folgenden Zugriff auf Ihr Konto:
- Benachrichtigungen lesen und löschen
- Benutzer-Sitzungsinformationen lesen
- Ein einmaliges Anmeldetoken erstellen
[Autorisieren]
API-Schlüssel-Generierungsfluss
Die API erfordert vom Benutzer nur eine einzige GET-Anfrage.
https://sitename.com/user-api-key/new
Ab Discourse 2.1 laufen diese Benutzer-API-Schlüssel automatisch ab, wenn sie längere Zeit nicht verwendet werden. Die Website-Einstellung:
revoke user api keys unused daysist standardmäßig auf 180 gesetzt
Parameter:
- auth_redirect: URL, zu der mit dem generierten Token zurückgeleitet werden soll
- application_name: der Name der anfragenden Anwendung (wird im Tab „Apps“ des Benutzerkontos angezeigt)
- client_id: eine eindeutige Kennung für den Client
- nonce: ein vom Client generierter eindeutiger Nonce. Dieser wird im verschlüsselten Payload zurückgegeben, damit der Client die Authentizität der Antwort überprüfen kann
- scopes: kommaseparierte Liste der für den Schlüssel zulässigen Zugriffsbereiche, siehe
allow user api key scopesfür die vollständige Liste der verfügbaren Scopes - push_url: URL, an die Push-Benachrichtigungen gesendet werden sollen (erforderlich und nur gültig, wenn
pushodernotificationsin den Scopes enthalten sind) - public_key: der öffentliche Teil des vom Client generierten Schlüsselpaars
- padding (optional): der RSA-Padding-Modus, der zur Verschlüsselung des Payloads verwendet wird. Akzeptierte Werte sind
pkcs1(Standard) oderoaep. OAEP wird für neue Anwendungen empfohlen.
Nachdem /user-api-key/new mit den korrekten Parametern aufgerufen wurde, können 2 Dinge passieren:
- Wenn der Benutzer nicht angemeldet ist, werden wir zur Anmeldung weitergeleitet (nach der Anmeldung setzen wir die Autorisierung fort)
- Sobald ein Benutzer angemeldet ist, wird ihm die Autorisierungs-UI angezeigt.
Nachdem die Autorisierung erteilt wurde, leitet das System zu der in auth_redirect angegebenen URL zurück und fügt einen verschlüsselten payload-Parameter hinzu, der ein JSON-Objekt mit dem generierten Benutzer-API-Schlüssel (key), dem nonce, dem Push-Status (push) und der API-Version (api) enthält. Wenn der Scope one_time_password angefordert wurde, wird auch ein separater verschlüsselter oneTimePassword-Query-Parameter enthalten sein. client_id wird aus Sicherheitsgründen nicht zurückgegeben.
Überprüfung der API-Version
Die Verwendung des Schlüssel-APIs in Discourse ist versioniert. Clients können die API-Version einer Discourse-Site überprüfen, indem sie eine HEAD-Anfrage an https://sitename.com/user-api-key/new stellen. Die Antwort enthält einen Header namens Auth-Api-Version, der die Versionsnummer der API der Website enthält.
Nutzung der API
Die Nutzung der Client-API unterscheidet sich etwas von der aktuellen Admin-API.
Der Client kann 2 Header angeben:
User-Api-Key (erforderlich): der Schlüssel, der generiert wurde
und
User-Api-Client-Id (optional): diesen übergeben, um die in der Datenbank gespeicherte „Client-ID“ für diesen api_key zu aktualisieren.
Sobald diese Header angegeben sind, kann der Client Anfragen gegen die API so stellen, wie er es normalerweise tun würde.
Generieren eines Einmal-Anmelde-Passworts
Ab Version 4 enthält die API einen speziellen Scope: den Scope one_time_password, der es Clients ermöglicht, den Benutzer-API-Schlüssel zur Generierung eines Einmal-Passworts zu verwenden. Wenn der Client diesen Scope beim Generieren des API-Schlüssels gemäß den oben genannten Schritten einschließt, wird ein verschlüsseltes oneTimePassword als separater Query-Parameter in der Rückleitung an den Client aufgenommen.
Alternativ kann der Client eine GET-Anfrage an /user-api-key/otp mit den folgenden Parametern senden:
- auth_redirect
- application_name
- public_key
- padding (optional)
und mit dem Header User-Api-Key.
Diese Anfrage leitet zu einem Bildschirm in Discourse weiter, auf dem der Benutzer die Anwendung zur Genehmigung des Zugriffs auf die Website aufgefordert wird. Wenn der Benutzer zustimmt, leitet die Website zurück an die in auth_redirect definierte URL und enthält einen verschlüsselten oneTimePassword-Parameter mit einem Einmal-Passwort, das der Client verwenden kann, um sich auf der Website anzumelden, indem er https://sitename.com/session/otp/ONE-TIME-PASSWORD anfordert. (Das Einmal-Passwort ist nur 10 Minuten lang gültig.)
Widerrufen von API-Schlüsseln
Um einen API-Schlüssel zu widerrufen, senden Sie eine POST-Anfrage mit dem Header User-Api-Key und ohne Parameter an /user-api-key/revoke.
Zuletzt geprüft von @SaraDev am 2022-07-13T00:00:00Z

