使用 Staff API 密钥的 list_users API 缺少电子邮件

继续讨论:获取用户邮箱,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

尝试使用 client.list_users('staff', show_emails: true)

请注意,访问此信息会出现在管理员面板的 staff 日志中。

6 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.