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