API list_users mit Staff-API-Schlüssel lässt E-Mails aus

Fortsetzung der Diskussion aus Get user email, emails.json seems not working:

Die API-Dokumentation für list_users besagt, dass die resultierende JSON-Antwort das Feld email bereitstellt. Die oben genannte Diskussion erwähnt Folgendes:

Wenn ich mit einem Staff-API-Schlüssel client.list_users('staff') aufrufe, erhalte ich eine Liste von Benutzern, aber nur mein eigener Eintrag zeigt das E-Mail-Feld. Ich würde erwarten, dass das E-Mail-Feld für alle Benutzer in der Liste zurückgegeben wird. Andernfalls muss ich die API für jeden Benutzer erneut aufrufen, um die E-Mail-Adresse abzurufen.

Da ich eine CSV-Datei mit Namen und E-Mail-Adressen habe, kann ich Benutzer nur über ihre E-Mail-Adressen nachschlagen, um die Datensätze zu bearbeiten oder neue Benutzer aus der eingehenden Liste zu erstellen. Das macht die Aufgabe etwas mühsam und fehleranfällig.

Im Allgemeinen denke ich, dass E-Mail-Adressen entweder im Klartext für Staff-Mitglieder verfügbar sein sollten oder als SHA256-Hash, eventuell mit einem Salt, das verhindert, dass beliebige Angreifer herausfinden, ob eine E-Mail-Adresse auf dieser Seite verwendet wird – obwohl sie andere Wege dafür haben, z. B. über Passwort-Erinnerungen oder Registrierung. Die Verwendung eines kryptografischen Hashs der E-Mail-Adresse würde es ermöglichen, ihre Existenz zu prüfen, ohne sie preiszugeben.

Wie auch immer, ich denke, dass das Fehlen des E-Mail-Werts in der Benutzerliste bei Verwendung eines Staff-API-Schlüssels ein Fehler ist und behoben werden sollte.

In der Zwischenzeit musst du, sobald du die Benutzerliste hast, durch sie iterieren und /u/#{username}/emails.json aufrufen, um die fehlende E-Mail-Adresse in die Liste einzufügen.


Hier ist ein Beispielcode:

module DiscourseApi::API::Users
  def user_email(username)
    response = get("/u/#{username}/emails.json")
    response.body['email']
  end
end

staff = client.list_users('staff')
staff.each_with_index do |u, i|
  next unless u['email'].nil?
  staff[i]['email'] = client.user_email(u['username'])
end

staff.sample['email'].nil? # => false

Versuchen Sie es mit client.list_users('staff', show_emails: true).

Beachten Sie, dass der Zugriff auf diese Informationen im Personalprotokoll im Administratorbereich erscheint.