Spezifikation der User API Keys

Ich habe es nach einigen Versuchen und Fehlern zum Laufen gebracht.

Hier sind die grundlegenden Schritte, die ich befolge, wenn ich eine separate App habe, die ich programmiert habe, und ich möchte, dass Benutzer diese App nutzen können, um API-Aufrufe an eine Discourse-Seite zu tätigen.

Dafür muss ich ein pro-Benutzer-API-Token generieren, um im Namen jedes spezifischen Benutzers Aufrufe zu tätigen (zumindest in einer Node.js/JavaScript-Umgebung).


Hinweis: Für den JavaScript-Teil habe ich den Code, den @KengoTODA hier bereitgestellt hat, als sehr hilfreich erachtet: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub


Hier sind die Schritte, die ich befolgt habe:

Erstens: Ein Schlüsselpaar aus öffentlicher und privater Schlüssel generieren.

Dies ist etwas, das Ihre App generieren muss – einen öffentlichen und einen privaten Schlüssel. Der GitHub-Gist bietet eine Methode dafür an.

Zweitens: Eine Redirect-URL bereitstellen.

Dies ist die URL, zu der Discourse weiterleitet und das finale API-Token im Payload bereitstellt. Wenn Sie eine Desktop-App haben (also eine ohne Browser-URL), basiert die Redirect-URL auf einem benutzerdefinierten Protokoll, das Sie eingerichtet haben und das die App öffnet, wenn die Redirect-URL im Browser eingegeben wird.

Beachten Sie, dass die Redirect-URL in den Site-Einstellungen der Ziel-Discourse-Seite freigegeben (whitelisted) sein muss.

Die Discourse-Seite muss zudem wahrscheinlich die Einstellung „Benutzer-API-Schlüssel zulassen" aktiviert haben. Weitere Informationen dazu finden Sie im Originalbeitrag zu diesem Thema unter „Site Settings".

Drittens: Den API-Anfrageaufruf an die Discourse-Request-URL senden.

Ihre App sendet also einen Aufruf an eine URL, die dieses Format hat:

https://[ihre Ziel-Discourse-Seite .com]/user-api-key-new

und folgende Parameter hinzufügt:

  • Ihr App-Name
  • Ihre „client_id" (Ich konnte für eine Desktop-App hostname() aus const {hostname} = require('os') verwenden, genau wie im oben genannten GitHub-Gist)
  • Scopes (dies sind die Berechtigungen, die der Benutzer über die API ausführen können soll, z. B. „write", „read" usw.)
  • Ihren öffentlichen Schlüssel (aus Schritt 1 oben)
  • Ihre Redirect-URL (aus Schritt 2 oben)
  • Nonce (dies ist ein Wert, den Sie wählen können – beispielsweise scheint die Verwendung von „1" zu funktionieren)

Viertens: Der Benutzer autorisiert Ihre App auf der Discourse-Seite, die durch die Request-URL geöffnet wird.

Wenn Sie die Request-URL erfolgreich senden, öffnet sich eine Seite auf der Discourse-Seite, die dem Benutzer mitteilt, dass Ihre App Zugriff auf die Seite möchte.

Auf dieser Seite befindet sich eine Schaltfläche, mit der der Benutzer dies zulassen kann. Wenn der Benutzer auf diese Schaltfläche klickt, leitet Discourse zur bereitgestellten Redirect-URL weiter und hängt als Parameter ?payload=[DER API-SCHLÜSSEL] an. Der API-SCHLÜSSEL hier ist der Schlüssel, den Sie in Ihrer App entschlüsseln müssen.

Fünftens: Ihre App nimmt den Redirect-URL-Wert (mit Payload-Wert) auf, und Sie entschlüsseln den API-SCHLÜSSEL.

Sie sind fast am Ziel. Ihre App muss die Redirect-URL, zu der Discourse weitergeleitet hat, analysieren und den darin enthaltenen API-Schlüssel aus dem Payload extrahieren.

Sobald Sie diesen API-Schlüssel haben, müssen Sie zwei Dinge tun:

  1. Den tatsächlichen Schlüssel erhalten, nicht die URL-kodierte Version: Wenn Sie einen Parameter aus einer URL erhalten, ist dieser oft URL-kodiert (mit % hier und dort usw.). Sie müssen ihn bereinigen. In JavaScript habe ich festgestellt, dass decodeURIComponent dafür funktioniert.
  2. Sobald Sie den bereinigten API-SCHLÜSSEL von Discourse erhalten haben, müssen Sie ihn entschlüsseln. Dafür können Sie die JavaScript-Entschlüsselung mit privaten Schlüsseln verwenden. Im Wesentlichen verwenden Sie Ihren privaten Schlüssel (im ersten Schritt oben generiert), um den bereinigten API-SCHLÜSSEL zu entschlüsseln. Es gibt einige Beispiel-Code-Schnipsel in JavaScript im oben genannten GitHub-Gist: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub

Nachdem Sie Ihren Entschlüsselungscode ausgeführt haben, haben Sie das Token selbst, das Sie nun verwenden können, um im Namen des Benutzers authentifizierte API-Aufrufe zu tätigen.

Sechstens: Verwenden Sie das Token (d. h. den finalen, bereinigten, entschlüsselten API-SCHLÜSSEL), um API-Aufrufe im Namen des Benutzers zu tätigen.

Mit diesem Token scheint es nicht erforderlich zu sein, den Benutzernamen im API-Aufruf anzugeben. Ich finde, dass folgender Header ausreicht, wenn Sie ihn in Ihren GET-, POST-, PUT- usw. Aufrufen einfügen:

headers: {
"User-Api-Key": [das Token]
}

Und damit haben Sie hoffentlich eine funktionierende pro-Benutzer-Authentifizierungsmethode, um mit Discourse zu interagieren.

7 „Gefällt mir“