Discourse enthält ein System zur Generierung von API-Schlüsseln pro Benutzer, wenn ein sehr spezifisches Protokoll befolgt wird. Diese Funktion ermöglicht den Zugriff von „Anwendungen“ auf Discourse-Instanzen, ohne Moderatoren einbeziehen zu müssen.
Hochlevel-Beschreibung
Auf hoher Ebene:
-
Der Client (Desktop-App, Browser-Plugin, Mobile App) generiert ein privates/öffentliches Schlüsselpaar und eine Rückgab-URL (return URL).
-
Der Client leitet zu einer Route in Discourse weiter und gibt Discourse seinen öffentlichen Schlüssel.
-
Discourse erhält die Genehmigung des Benutzers, die App zu verwenden.
-
Discourse generiert einen Benutzer-API-Schlüssel.
-
Discourse leitet zurück zur Rückgab-URL weiter und sendet eine mit dem öffentlichen API-Schlüssel verschlüsselte Payload, die den Benutzer-API-Schlüssel enthält.
Details
Anwendungsfälle:
-
Desktop-Anwendungen, die im Auftrag von Endbenutzern Discourse-Sites abfragen, um Benachrichtigungszahlen über mehrere Sites hinweg zu erhalten.
-
Mobile Anwendungen, die im Auftrag von Endbenutzern Discourse-Sites abfragen und Push-Benachrichtigungen verarbeiten.
-
Webanwendungen, die Endbenutzern ein Dashboard zu verschiedenen Discourse-Sites bereitstellen.
-
Custom-Integrationen mit Drittanbieter-Apps, die Discourse als Teil einer allgemeinen Unternehmens-App nutzen. Z. B.: Integration von Discourse-Community-Benachrichtigungen in die Hopscotch-App.
Das Design:
Site-Einstellungen
-
allow_user_api_key_scopes: erlaubte Zugriffsbereiche (Scopes) für Benutzer-API-Schlüssel. Die Bereiche sind hier definiert. Die verfügbaren eingebauten Bereiche sind:
read,write,message_bus,push,one_time_password,notifications,session_info,bookmarks_calendar,user_status(Plugins können zusätzliche Bereiche registrieren). -
user_api_key_allowed_groups: steuert, welche Gruppen Benutzer-API-Schlüssel generieren dürfen (Standard: Admins, Moderatoren und trust_level_0).
-
allowed_user_api_push_urls: Liste von Sites, die als Ziele für Push-Benachrichtigungen dienen können.
-
allowed_user_api_auth_redirects: erlaubte Weiterleitungsziele nach der Generierung des Benutzer-API-Schlüssels.
Globale Einstellungen
- max_user_api_reqs_per_minute: 50
- max_user_api_reqs_per_day: 4000
UX-Elemente
Wenn Benutzer-API-Schlüssel erteilt wurden, zeigt Discourse einen Apps-Tab auf der Benutzerseite an.
Der Apps-Tab listet auf:
- Den Namen der Anwendung, z. B.: („Discourse Notifier“)
- Datum der letzten Nutzung
- Genehmigungsdatum
- Liste der erteilten Zugriffsbereiche
- Eine Zugriff widerrufen-Schaltfläche, damit du Schlüssel einfach widerrufen kannst
API-Schlüssel-Autorisierungs-UI
Jeder Schlüssel muss von den Endbenutzern auf einer Seite explizit autorisiert werden, die klar erklärt, was geschieht. Zum Beispiel:
„Discourse Notifier“ fordert folgende Zugriffsrechte für dein Konto an:
- Benachrichtigungen lesen und löschen
- Benutzersitzungs-Info lesen
- Einmaliges Login-Token erstellen
[Autorisieren]
API-Schlüssel-Generierungsablauf
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 über längere Zeit nicht verwendet werden. Die Site-Einstellung
revoke user api keys unused daysist standardmäßig auf 180 Tage gesetzt.
Parameter:
- auth_redirect: URL, zu der mit dem generierten Token weitergeleitet werden soll.
- application_name: der Name der Anwendung, die die Anfrage stellt (wird im Apps-Tab des Benutzerkontos angezeigt).
- client_id: eine eindeutige Kennung für den Client.
- nonce: eine vom Client generierte eindeutige Nonce. Diese wird in der verschlüsselten Payload zurückgesendet, damit der Client die Authentizität der Antwort überprüfen kann.
- scopes: durch Kommas getrennte Liste der für den Schlüssel erlaubten Zugriffsbereiche. Siehe
allow user api key scopesfür die vollständige Liste der verfügbaren Bereiche. - push_url: URL, an die Benachrichtigungen gesendet werden sollen (erforderlich und gültig nur, wenn
pushodernotificationsin den Bereichen enthalten sind). - public_key: der öffentliche Teil des vom Client generierten Schlüsselpaars.
- padding (optional): der RSA-Padding-Modus, der zum Verschlüsseln der Payload verwendet werden soll. Akzeptierte Werte sind
pkcs1(Standard) oderoaep. OAEP wird für neue Anwendungen empfohlen.
Nachdem /user-api-key/new mit den korrekten Parametern aufgerufen wurde, kann eines von zwei Dingen 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.
Nach der Genehmigung der Autorisierung leitet das System zurück zur in auth_redirect definierten URL weiter und fügt einen verschlüsselten payload-Parameter hinzu, der ein JSON-Objekt mit dem generierten Benutzer-API-Schlüssel (key), der nonce, dem Push-Status (push) und der API-Version (api) enthält. Wenn der Bereich one_time_password angefordert wurde, wird auch ein separater verschlüsselter oneTimePassword-Abfrageparameter hinzugefügt. client_id wird aus Sicherheitsgründen nicht zurückgesendet.
Überprüfen der API-Version
Die Use-Key-API 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 senden. Die Antwort enthält einen Header namens Auth-Api-Version mit der Versionsnummer der API der Site.
Nutzen der API
Die Nutzung der Client-API unterscheidet sich etwas von der aktuellen Admin-API.
Der Client kann zwei Header angeben:
User-Api-Key (erforderlich): der generierte Schlüssel
und
User-Api-Client-Id (optional): gib dies an, um die in der Datenbank für diesen api_key gespeicherte ‘client id’ zu aktualisieren.
Sobald diese Header angegeben sind, kann der Client Anfragen an die API stellen, genau wie normalerweise.
Generieren eines einmaligen Login-Passworts
Ab Version 4 enthält die API einen speziellen Bereich: den Bereich one_time_password, der es Clients ermöglicht, den Benutzer-API-Schlüssel zu verwenden, um ein einmaliges Passwort zu generieren. Wenn der Client diesen Bereich beim Generieren des API-Schlüssels gemäß den obigen Schritten einschließt, wird ein verschlüsselter oneTimePassword als separater Abfrageparameter in der Weiterleitung zurück zum Client enthalten sein.
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, der den Benutzer auffordert, der Anwendung den Zugriff auf die Site zu gewähren. Wenn der Benutzer zustimmt, leitet die Site zurück zur in auth_redirect definierten URL weiter und fügt einen verschlüsselten oneTimePassword-Parameter mit einem einmaligen Passwort hinzu, das der Client verwenden kann, um sich bei der Site anzumelden, indem er https://sitename.com/session/otp/ONE-TIME-PASSWORD anfordert. (Das einmalige Passwort ist nur 10 Minuten gültig.)
Widerrufen von API-Schlüsseln
Um einen API-Schlüssel zu widerrufen, sende eine POST-Anfrage mit dem Header User-Api-Key und ohne Parameter an /user-api-key/revoke.
Zuletzt überprüft von @SaraDev am 2022-07-13T00:00:00Z
