Não foi possível obter o usuário por ID externo

Olá,

Tenho tentado obter um usuário por ID externo usando a documentação:

https://docs.discourse.org/#tag/Users/paths/~1u~1by-external~1{external_id}.json/get

Ele retorna um erro “404 não encontrado” com qualquer usuário que eu tente. Usando o mesmo URI, chave de API e nome de usuário, consigo obter categorias e grupos. Alguma sugestão?

Atenciosamente,

Mark Pemburn
Blue Ocean Ideas

1 curtida

Veja Como fazer engenharia reversa na API do Discourse

@pfaffman Não entendi sua resposta, ela não contém uma resposta. Aquele tópico mostra como descobrir endpoints que não estão documentados. Este está, e é um dos poucos chamados de API que não podem ser revertidos dessa forma, já que esse endpoint de API específico nunca é chamado pelo frontend Ember?

@mpemburn deveria funcionar, a documentação parece correta. O ID externo é o ID no seu banco de dados remoto, que é passado quando você tem o SSO ativado. Você pode compartilhar seu código?

5 curtidas

Ops. Na maioria das vezes, a resposta para “a documentação da API está quebrada, como faço para…” é o que eu vinculei. Olhando mais de perto, é dolorosamente óbvio que algo envolvendo IDs externos não pode ser acessado via UX. Sorte do Mark que você está prestando mais atenção!

Teoria #1:
Na maioria das vezes (nem sempre), o ID externo é um ID de banco de dados e, portanto, um valor numérico. Tem certeza de que seu ID externo é mark89? O comando SingleSignOnRecord.find_by(external_id: 'mark89') retorna um registro no banco de dados?

Teoria #2:
Seu site de staging não tem SSO ativado, o que geralmente anda de mãos dadas com IDs externos. Tem certeza de que os IDs externos estão presentes?

Espere… Seus cabeçalhos estão em um cookie? Isso não está correto… deveria ser assim:

curl --location --request GET 'https://discourse.example.com/u/by-external/mark89.json'
    --header 'Accept: application/json' 
    --header 'Api-Key=[Api-Key]'
    --header 'Api-Username=system'
6 curtidas

Ah, infelizmente, isso também não funciona.

Tentei a mesma solicitação usando o plugin Discourse do WordPress e ela também não funciona com ele, embora a solicitação para obter um usuário por e-mail funcione. Pensando que poderia ser um problema com nossa versão de sandbox do Discourse (que é com a qual tenho testado até agora), tentei em nossa instância de produção, e a história é a mesma. Não sei o que fazer a partir daqui, mas preciso realmente que isso funcione.

Mark

Você verificou as duas teorias que escrevi antes de perceber que você estava enviando os cabeçalhos de autenticação da maneira errada?

Teoria #1:
Na maioria das vezes (nem sempre), o ID externo é um ID de banco de dados e, portanto, um valor numérico. Tem certeza de que seu ID externo é mark89? SingleSignOnRecord.find_by(external_id: 'mark89') retorna um registro do banco de dados?

Teoria #2:
Seu site de staging não tem o SSO ativado, o que geralmente anda de mãos dadas com IDs externos. Tem certeza de que os IDs externos estão presentes?

1 curtida

Richard,

Tudo bem, então o sandbox não tem SSO configurado, mas a produção sim. Verifiquei meu registro de usuário na produção e, sim, o external ID está definido e, de fato, é um ID numérico. Quando testei com as credenciais e URI de produção e o external ID real, retornou o mesmo erro 404.

Ah, e não tenho certeza de como testar SingleSignOnRecord.find_by(external_id: ‘mark89’). Onde fica essa funcionalidade?

Mark

cd /var/discourse
./launcher enter app
rails c
SingleSignOnRecord.find_by(external_id: 'mark89')
4 curtidas