Как получить external_id из объекта user?

Когда я использую API для получения объекта пользователя Discourse, всё работает нормально, но я не вижу включённого external_id. Если у меня есть ID пользователя Discourse или его имя пользователя, как я могу получить external_id?

http://localhost:3000/admin/users/1/blake.erickson.json

Будет содержать информацию SSO:

Ага — я вызывал /users/blake.erickson.json (без /admin), который тоже возвращает объект пользователя, но без single_sign_on_record.

Кстати, почему эндпоинт /users/ принимает (только?) имя пользователя, а если нужно получить пользователя по его ID в Discourse, то используется /admin/users/:id.json? Это просто особенности проектирования API?

Дальше ещё страннее: если я получаю пользователя по его external_id, вызывая /users/by-external/:id.json, то single_sign_on_record в ответе отсутствует.

Так что у API есть свои причуды… иногда объект пользователя содержит свойства single_sign_on_record, а иногда нет :wink:

По замыслу административная конечная точка возвращает больше данных, чем обычная конечная точка. Да, обе они запрашивают записи «user», но было бы крайне плохо, если бы конечная точка /user/..., которую могут вызывать обычные пользователи, возвращала то же самое, что и /admin/user/....

Ага, я не знал, что эндпоинт /user доступен для отдельных пользователей. Я забыл, что существуют ключи API для пользователей.

Меня постоянно сбивают с толку несоответствия. Сейчас, если мне нужен single_sign_on_record, я должен знать ID пользователя Discourse (запрос к /admin/users/:username.json не работает)… но большинство других вызовов API, похоже, требуют имя пользователя (например, /users/:username.json).

Кроме того, существуют отдельные эндпоинты API, которые очень похожи и кажутся почти идентичными, но возвращают разные результаты. Например, /admin/users возвращает данные single_sign_on_record для пользователя, а вызов просто /users/ — нет.

В этом нет ничего критичного, я разбираюсь по ходу дела… когда я продвинусь дальше, возможно, попробую немного доработать документацию и сделать некоторые моменты более понятными.

Различие здесь проистекает из того факта, что конечные точки возвращают данные, необходимые для отображения страниц в пользовательском интерфейсе. Посмотрите здесь:

Конечно, я прекрасно понимаю — и я сам использую этот трюк для отслеживания всех этих XHR-запросов. Всё в порядке. Просто… это работает нестабильно. :wink: Но я бесконечно благодарен, что у Discourse такой мощный API!