API list_users com chave de API de Staff não inclui e-mails

Continuando a discussão de Obter e-mail do usuário, emails.json parece não funcionar:

A documentação da API para list_users afirma que a resposta JSON resultante fornece o campo email. A discussão acima menciona que:

Usando uma chave de API de equipe, quando chamo client.list_users('staff'), recebo uma lista de usuários, mas apenas minha entrada mostra o campo de e-mail. Eu esperaria que o campo de e-mail fosse retornado para todos os usuários na lista. Caso contrário, tenho que chamar a API novamente para cada usuário para recuperar o e-mail.

Como tenho um arquivo CSV com nomes e e-mails, só posso pesquisar usuários por seus e-mails para manipular os registros ou criar novos usuários a partir da lista de entrada. Isso torna o trabalho um pouco tedioso e propenso a erros.

Em geral, acho que os e-mails devem estar disponíveis de forma clara para a equipe ou como um hash SHA256, talvez com algum salt que impediria atacantes arbitrários de descobrir se um e-mail é usado neste site — embora existam outras maneiras de fazer isso, como lembretes de senha ou registro. Usar um hash criptográfico do e-mail permitiria verificar sua presença sem divulgá-lo.

De qualquer forma, acho que não ter o valor do e-mail na lista de usuários usando uma chave de API de equipe é um bug e deve ser corrigido.

Enquanto isso, uma vez que você tenha a lista de usuários, deve iterar sobre ela e chamar /u/#{username}/emails.json para injetar o e-mail faltante na lista.


Aqui está algum código:

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

Tente usar client.list_users('staff', show_emails: true)

Observe que acessar essas informações aparecerá no log da equipe no painel de administrador.