외부 ID로 사용자를 가져올 수 없습니다

안녕하세요,

문서에서 설명하는 대로 외부 ID를 사용하여 사용자를 가져오려고 시도하고 있습니다:

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

어떤 사용자를 시도해도 “404 not found” 오류가 반환됩니다. 동일한 URI와 API 키, 사용자 이름을 사용하면 카테고리나 그룹은 정상적으로 가져올 수 있습니다. 조언이 있을까요?

감사합니다,

Mark Pemburn
Blue Ocean Ideas

Discourse API 역공학하기를 참고하세요.

@pfaffman님의 답변을 이해하지 못하겠습니다. 답변이 포함되어 있지 않아요. 해당 주제는 문서화되지 않은 엔드포인트를 찾는 방법을 보여줍니다. 이 엔드포인트는 문서화되어 있으며, 이 특정 API 엔드포인트는 Ember 프론트엔드에서 절대 호출되지 않기 때문에 그렇게 역공학할 수 있는 API 호출 중 아주 극소수에 해당합니다.

@mpemburn님, 동작해야 합니다. 문서가 올바르게 보입니다. 외부 ID는 SSO를 활성화했을 때 전달되는 원격 데이터베이스의 ID입니다. 코드를 공유해 주실 수 있을까요?

아, 실수였습니다. "API 문서가 깨졌는데 어떻게 해야 하나요…"라는 질문에 대한 답은 대부분 제가 링크한 내용입니다. 더 자세히 살펴보니, 외부 ID와 관련된 것은 UX를 통해 접근할 수 없다는 것이 painfully(매우) 분명해집니다. 마크에게는 다행히도 여러분이 더 세심하게 주의를 기울이고 있었네요!

이론 #1:
대부분의 경우(항상 그런 것은 아니지만) 외부 ID는 데이터베이스 ID이므로 숫자 값입니다. 외부 ID가 mark89인지 확인해 보셨나요? SingleSignOnRecord.find_by(external_id: 'mark89')가 데이터베이스 레코드를 반환하나요?

이론 #2:
스테이징 사이트에 SSO가 활성화되어 있지 않은 것 같습니다. SSO는 보통 외부 ID와 함께 사용됩니다. 외부 ID가 존재하는지 확인해 보셨나요?

잠깐… 헤더가 쿠키에 있나요? 그것은 적절하지 않습니다… 이렇게 되어야 합니다:

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'

아, 아쉽게도 그것도 작동하지 않습니다.

워드프레스 Discourse 플러그인을 사용하여 동일한 요청을 시도해 보았지만, 그것으로도 작동하지 않습니다. 이메일로 사용자 정보를 가져오는 요청은 정상적으로 작동하는 반면, 이 요청은 작동하지 않네요. 샌드박스 버전의 Discourse(지금까지 테스트에 사용했던 버전)에 문제가 있는 것 같아서 프로덕션 인스턴스에서도 시도해 보았지만, 결과는 동일합니다. 이제 어떻게 해야 할지 모르겠지만, 이 기능이 꼭 정상적으로 작동해야 합니다.

마크

인증 헤더를 잘못된 방식으로 전송하고 있다는 것을 알게 되기 전에 제가 작성했던 두 가지 추측을 확인해 보셨나요?

추측 #1:
대부분의 경우(항상 그런 것은 아니지만) 외부 ID는 데이터베이스 ID이므로 숫자 값입니다. 외부 ID가 mark89인 것이 확실한가요? SingleSignOnRecord.find_by(external_id: 'mark89')가 데이터베이스 레코드를 반환하나요?

추측 #2:
스테이징 사이트에는 SSO가 활성화되어 있지 않은 것 같습니다. SSO는 보통 외부 ID와 함께 사용됩니다. 외부 ID가 존재하는지 확실한가요?

Richard,

알겠습니다. 샌드박스에는 SSO가 설정되어 있지 않고 프로덕션에는 설정되어 있네요. 프로덕션에서 제 사용자 기록을 확인해 보니, 외부 ID가 설정되어 있었고 실제로 숫자 ID였습니다. 프로덕션 자격 증명과 URI, 그리고 실제 외부 ID로 테스트해 보았지만, 동일한 404 오류가 반환되었습니다.

그리고 SingleSignOnRecord.find_by(external_id: ‘mark89’)를 어떻게 테스트해야 할지 모르겠습니다. 이 기능은 어디에 있나요?

Mark

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