Wie kann ich die external_id aus dem User-Objekt erhalten?

Wenn ich die API verwende, um das Discourse-Benutzerobjekt abzurufen, funktioniert das einwandfrei, aber die external_id ist dort nicht enthalten. Wenn ich eine Discourse-Benutzer-ID oder einen Benutzernamen habe, wie kann ich daraus die external_id ermitteln?

http://localhost:3000/admin/users/1/blake.erickson.json

Enthält die SSO-Informationen:

Aha – ich habe /users/blake.erickson.json (ohne /admin) aufgerufen, was ebenfalls ein Benutzerobjekt zurückgibt, aber ohne single_sign_on_record.

Hey, warum akzeptiert der /users/-Endpunkt (nur?) einen Benutzernamen, während man für die Abfrage eines Benutzers über seine Discourse-ID /admin/users/:id.json verwenden muss? Sind das nur Eigenarten des API-Designs?

Noch eine weitere Merkwürdigkeit: Wenn ich einen Benutzer über seine external_id abrufe, indem ich /users/by-external/:id.json aufrufe, erhalte ich ebenfalls keine single_sign_on_record.

Die API hat also ihre Eigenheiten … manchmal enthält ein Benutzerobjekt die Eigenschaften von single_sign_on_record, manchmal nicht :wink:

Das Admin-Endpunkt gibt per Design mehr Daten zurück als der Nicht-Admin-Endpunkt. Ja, beide holen „user“-Datensätze ab, aber es wäre äußerst problematisch, wenn das /user/...-Endpunkt, das reguläre Benutzer aufrufen können, dasselbe zurückgäbe wie /admin/user/....

Aha, ich wusste nicht, dass der /user-Endpunkt für einzelne Benutzer verfügbar ist. Ich hatte vergessen, dass es so etwas wie User-API-Schlüssel gibt.

Ich werde immer wieder von Inkonsistenzen überrascht. Momentan muss ich, wenn ich single_sign_on_record benötige, die Discourse-Benutzer-ID kennen (/admin/users/:username.json funktioniert nicht) – aber die meisten anderen API-Aufrufe scheinen den Benutzernamen zu erfordern (wie /users/:username.json).

Dann gibt es noch separate API-Endpunkte, die sich sehr ähnlich sind und fast identisch wirken, aber unterschiedliche Ergebnisse liefern. Beispielsweise liefert /admin/users die single_sign_on_record-Daten für den Benutzer, während ein Aufruf von nur /users/ dies nicht tut.

Das alles ist kein großes Problem, ich arbeite mich Schritt für Schritt ein. Sobald ich weiter fortgeschritten bin, werde ich vielleicht versuchen, die Dokumentation etwas anzupassen und einige dieser Punkte klarer zu gestalten.

Der Unterschied ergibt sich daraus, dass die Endpoints die Daten zurückgeben, die zum Rendern der Seiten in der Benutzeroberfläche benötigt werden. Schauen Sie sich das hier an:

Klar, ich verstehe das total – und ich nutze diesen Trick, um all diese XHR-Anfragen zu überwachen. Alles gut. Es ist nur… inkonsistent. :wink: Aber ich bin unendlich dankbar, dass Discourse eine so starke API hat!