Не удалось получить пользователя по внешнему ID

Здравствуйте,

Я пытаюсь получить пользователя по внешнему ID, следуя документации:

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

При этом для любого пользователя возвращается ошибка «404 не найдено». Используя тот же URI, ключ API и имя пользователя, я могу успешно получать категории и группы. Есть какие-либо предложения?

С уважением,

Марк Пемберн
Blue Ocean Ideas

Смотрите Как выполнить реверс-инжиниринг API Discourse

@pfaffman Я не понимаю ваш ответ, в нем нет ответа. Та тема показывает, как узнать о эндпоинтах, которые не задокументированы. Этот же задокументирован, и это один из очень немногих вызовов API, которые нельзя таким образом реверс-инжинирить, поскольку этот конкретный эндпоинт API никогда не вызывается фронтендом на Ember?

@mpemburn Должно работать, документация выглядит корректно. Внешний ID — это ID в вашей удаленной базе данных, который передается, когда включен SSO. Можете поделиться своим кодом?

Ой. Чаще всего ответ на вопрос «документация API сломана, как мне…» — это то, на что я дал ссылку. При более внимательном рассмотрении становится болезненно очевидным, что что-то, связанное с внешними идентификаторами, невозможно получить через пользовательский интерфейс. Марку повезло, что вы обращаете на это больше внимания!

Теория №1:
В большинстве случаев (но не всегда) внешний ID является идентификатором базы данных и, следовательно, представляет собой числовое значение. Вы уверены, что ваш внешний ID — это mark89? Возвращает ли SingleSignOnRecord.find_by(external_id: 'mark89') запись из базы данных?

Теория №2:
На вашем тестовом сайте не включена SSO, что обычно сопровождается использованием внешних ID. Вы уверены, что внешние ID присутствуют?

Подождите… Ваши заголовки находятся в cookie? Это недопустимо… должно быть так:

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'

Ах, увы, это тоже не работает.

Я пробовал делать этот же запрос через плагин WordPress для Discourse, и он тоже не работает, хотя запрос на получение пользователя по электронной почте работает. Подумав, что проблема может быть в нашей песочнице Discourse (с которой я тестировал до сих пор), я попробовал это на продакшн-экземпляре, и история та же. Не знаю, что делать дальше, но мне действительно нужно, чтобы это работало.

Марк

Вы проверили две мои теории, которые я изложил до того, как увидел, что вы отправляете заголовки аутентификации неверным способом?

Теория №1:
В большинстве случаев (но не всегда) внешний идентификатор является идентификатором базы данных и, следовательно, числовым значением. Уверены ли вы, что ваш внешний идентификатор — mark89? Возвращает ли запрос SingleSignOnRecord.find_by(external_id: 'mark89') запись из базы данных?

Теория №2:
На вашем тестовом сайте не включен SSO, что обычно идет рука об руку с внешними идентификаторами. Уверены ли вы, что внешние идентификаторы присутствуют?

Ричард,

Хорошо, значит, в песочнице SSO не настроен, а в продакшене — да. Я проверил свою запись пользователя в продакшене: да, внешний ID установлен, и это действительно числовой ID. Когда я протестировал с учётными данными и URI продакшена, используя реальный внешний ID, вернулся тот же самый error 404.

О, и я не уверен, как протестировать SingleSignOnRecord.find_by(external_id: ‘mark89’). Где находится эта утилита?

Марк

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