Get user email, emails.json seems not working の議論を続けます:
list_users の API ドキュメントでは、結果の JSON レスポンスに email フィールドが含まれると記載されています。上記の議論では以下のように述べられています:
スタッフ API キーを使用して client.list_users('staff') を呼び出すと、ユーザーのリストが返されますが、メールアドレスフィールドが表示されるのは自分のエントリのみです。リスト内のすべてのユーザーに対してメールアドレスフィールドが返されることを期待していました。そうではない場合、各ユーザーに対して再度 API を呼び出してメールアドレスを取得する必要があります。
名前とメールアドレスを含む CSV ファイルを持っているため、レコードを操作したり、受け取ったリストから新しいユーザーを作成したりするには、メールアドレスを通じてユーザーを検索することしかできません。これにより、作業が少し面倒になり、エラーが発生しやすくなります。
一般的に、スタッフにはメールアドレスを平文で表示するか、SHA256 ハッシュとして表示するべきだと考えます。ただし、ランダムな攻撃者がこのサイトで特定のメールアドレスが使用されているかどうかを特定できないようにするために、ソルトを付加する必要があるかもしれません(ただし、パスワードのリマインダーや登録など、他の方法でそれを確認することは可能です)。メールアドレスの暗号化ハッシュを使用することで、その存在を確認しつつも開示することなくチェックできます。
とにかく、スタッフ API キーを使用してユーザーリストを取得する際にメールアドレス値が表示されないことはバグであり、修正されるべきだと考えます。
当面の間、ユーザーリストを取得した後、それを反復処理し、/u/#{username}/emails.json を呼び出してリストに欠落しているメールアドレスを追加する必要があります。
以下にコードを示します:
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