Suite de la discussion depuis Obtenir l’email de l’utilisateur, emails.json ne semble pas fonctionner :
La documentation de l’API pour list_users indique que la réponse JSON contient le champ email. La discussion mentionne ce qui suit :
En utilisant une clé API réservée au personnel, lorsque j’appelle client.list_users('staff'), je reçois une liste d’utilisateurs, mais seul mon entrée affiche le champ email. Je m’attendrais à ce que le champ email soit renvoyé pour tous les utilisateurs de la liste. Sinon, je dois appeler l’API à nouveau pour chaque utilisateur afin de récupérer l’email.
Puisque j’ai un fichier CSV contenant des noms et des adresses e-mail, je ne peux rechercher les utilisateurs que par leur adresse e-mail afin de modifier les enregistrements ou de créer de nouveaux utilisateurs à partir de la liste entrante. Cela rend la tâche un peu fastidieuse et sujette aux erreurs.
En général, je pense que les adresses e-mail devraient être disponibles soit en clair pour le personnel, soit sous forme de hachage SHA256, peut-être avec un sel qui empêcherait des attaquants arbitraires de découvrir si une adresse e-mail est utilisée sur ce site — bien qu’ils aient d’autres moyens de le faire, par exemple via des rappels de mot de passe ou des inscriptions. L’utilisation d’un hachage cryptographique de l’adresse e-mail permettrait de vérifier sa présence sans la divulguer.
Quoi qu’il en soit, je pense que l’absence de la valeur d’email dans la liste des utilisateurs lors de l’utilisation d’une clé API réservée au personnel est un bug qui devrait être corrigé.
En attendant, une fois que vous avez la liste des utilisateurs, vous devez parcourir cette liste et appeler /u/#{username}/emails.json pour injecter l’email manquant dans la liste.
Voici un exemple de code :
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