Impossible de récupérer l'utilisateur par ID externe

Bonjour,

J’essaie de récupérer un utilisateur à partir de son identifiant externe en suivant la documentation :

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

Cela renvoie une erreur « 404 non trouvé » quel que soit l’utilisateur essayé. En utilisant le même URI, la même clé API et le même nom d’utilisateur, je parviens à récupérer les catégories et les groupes. Avez-vous des suggestions ?

Cordialement,

Mark Pemburn
Blue Ocean Ideas

1 « J'aime »

Voir Comment procéder à l’ingénierie inverse de l’API Discourse

@pfaffman Je ne comprends pas votre réponse, elle ne contient pas de réponse. Ce sujet explique comment trouver des points de terminaison non documentés. Celui-ci l’est, et c’est l’un des très rares appels d’API qui ne peuvent pas être décomposés de cette manière, car ce point de terminaison API spécifique n’est jamais appelé par le frontend Ember ?

@mpemburn Cela devrait fonctionner, la documentation semble correcte. L’ID externe est l’ID de votre base de données distante, qui est transmis lorsque vous avez activé SSO. Pouvez-vous partager votre code ?

5 « J'aime »

Oups. La réponse la plus courante à la question « La documentation de l’API est brisée, comment puis-je… » est ce que j’ai lié. En y regardant de plus près, il est douloureusement évident que quelque chose impliquant des identifiants externes ne peut pas être accessible via l’interface utilisateur. Heureusement pour Mark que tu portes une attention particulière !

Théorie n°1 :
La plupart du temps (mais pas toujours), l’ID externe est un identifiant de base de données et donc une valeur numérique. Êtes-vous sûr que votre ID externe est mark89 ? La commande SingleSignOnRecord.find_by(external_id: 'mark89') renvoie-t-elle un enregistrement de base de données ?

Théorie n°2 :
Votre site de staging n’a pas l’authentification unique (SSO) activée, ce qui va généralement de pair avec les ID externes. Êtes-vous sûr que les ID externes sont présents ?

Attendez… Vos en-têtes sont dans un cookie ? Ce n’est pas correct… cela devrait ressembler à ceci :

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 « J'aime »

Ah, hélas, cela ne fonctionne pas non plus.

J’ai essayé la même requête avec le plugin Discourse pour WordPress, et cela ne fonctionne pas non plus, bien que la requête pour obtenir un utilisateur par e-mail fonctionne. Pensant qu’il pourrait s’agir d’un problème avec notre version de test (sandbox) de Discourse (avec laquelle j’ai fait mes tests jusqu’à présent), je l’ai essayé sur notre instance de production, et l’histoire est la même. Je ne sais pas quoi faire à partir de maintenant, mais j’ai vraiment besoin que cela fonctionne.

Mark

Avez-vous vérifié mes deux théories que j’ai écrites avant de voir que vous envoyiez les en-têtes d’authentification de la mauvaise manière ?

Théorie n°1 :
La plupart du temps (mais pas toujours), l’ID externe est un identifiant de base de données et donc une valeur numérique. Êtes-vous sûr que votre ID externe est mark89 ? Est-ce que SingleSignOnRecord.find_by(external_id: 'mark89') renvoie un enregistrement de base de données ?

Théorie n°2 :
Votre site de test n’a pas l’SSO activé, ce qui va généralement de pair avec les IDs externes. Êtes-vous sûr que les IDs externes sont présents ?

1 « J'aime »

Richard,

D’accord, donc l’environnement de test (sandbox) n’a pas la SSO configurée, mais la production, si. J’ai vérifié mon enregistrement utilisateur en production et, oui, l’ID externe est défini et c’est bien un ID numérique. Lorsque j’ai testé avec les identifiants et l’URI de production ainsi que le vrai ID externe, cela renvoie la même erreur 404.

Oh, et je ne suis pas sûr de savoir comment tester SingleSignOnRecord.find_by(external_id: ‘mark89’). Où se trouve cette fonctionnalité ?

Mark

cd /var/discourse
./launcher enter app
rails c
SingleSignOnRecord.find_by(external_id: 'mark89')
4 « J'aime »