Criar usuário programaticamente com ID de usuário OAuth2

Existe alguma maneira de inserir uma linha na tabela user_associated_account a partir da REST API?

Para dar um pouco de contexto, preciso ser capaz de criar usuários na nossa instância do Discourse e vinculá-los ao nosso provedor OAuth2.
Quando os usuários fazem login na interface do Discourse (através do plugin OAuth2 Basic), a conta deles é vinculada e posso obter o ID do usuário do Discourse a partir do UID externo deles usando GET /u/by-external/oauth2_basic/{external_uid}.
No entanto, quando criamos usuários via REST API (POST /users.json), não vejo nenhuma maneira de vincular a conta deles à conta OAuth2 correspondente (caso não façam login manualmente no Discourse).

FYI, o plugin OAuth2 basic implementou o novo sistema Auth::ManagedAuthenticator: Move to ManagedAuthenticator by angusmcleod · Pull Request #21 · discourse/discourse-oauth2-basic · GitHub

O que tentei:

  • Pesquisei na documentação da API e não encontrei nenhuma pista.
  • Descobri qual rota da API é chamada para obter as contas associadas de um usuário: GET /u/{username}/emails.json. Mas essa rota não parece suportar o método HTTP PUT e não expõe os campos da tabela user_associated_accounts (provider_name, provider_uid e user_id).
  • Também verifiquei as configurações do Discourse para ver se havia algo relacionado a esse problema, sem sucesso.
  • Procurei no meta.discourse.org e não encontrei uma solução.

Qualquer ajuda é muito apreciada! Obrigado :slight_smile:

Contanto que você crie o usuário com o mesmo endereço de e-mail que o OAuth, não precisa se preocupar.

1 curtida

Obrigado pelo seu feedback!
Gostaria de não me preocupar com isso, mas preciso ser capaz de obter o usuário a partir do meu ID do provedor ( GET /u/by-external/oauth2_basic/{external_uid}).
Isso não é possível até que o usuário faça login manualmente através da interface (eu quero evitar isso).

Eu pensaria em expor os associated_accounts assim ao criar um novo usuário:

POST /users.json
{
  username: "algo",
  email: "test@test.com",
  associated_accounts: [
    {
      provider_name: "oauth2_basic",
      provider_uid: "12345"
    }
  ]
}

Isso seria perfeito!

Nota: isso é semelhante aos parâmetros provider e extern_uid da API de Usuários do Gitlab (Users API | GitLab Docs)