继续讨论:获取用户邮箱,emails.json 似乎不起作用:
list_users 的 API 文档指出,返回的 JSON 响应中包含 email 字段。上述讨论提到:
使用管理员 API 密钥调用 client.list_users('staff') 时,我收到了用户列表,但只有我自己的条目显示了 email 字段。我期望列表中的所有用户都返回 email 字段。否则,我就必须为每个用户再次调用 API 来获取邮箱。
由于我手头有一个包含姓名和邮箱的 CSV 文件,我只能通过邮箱来查找用户,以便处理记录或从传入的列表中创建新用户。这使得工作变得有些繁琐且容易出错。
一般来说,我认为邮箱应该对管理员以明文形式提供,或者以 SHA256 哈希形式提供(可能带有某种盐值,以防止任意攻击者发现某个邮箱是否在该站点使用——尽管他们还有其他方法可以做到这一点,例如密码提醒或注册)。使用邮箱的加密哈希可以在不泄露其内容的情况下检查其是否存在。
无论如何,我认为在使用管理员 API 密钥获取用户列表时不包含邮箱值是一个 bug,应该予以修复。
在此期间,一旦你获取了用户列表,就必须遍历它并调用 /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