여러 사용자의 User JS 객체 `groups` 배열이 값이 채워지지 않음

현재 사용자의 소속 그룹을 확인하기 위해 Discourse JS User Object를 사용하고 있습니다.

일부 사용자의 경우, User JS Object의 groups 배열이 각 그룹에 대한 설명을 담은 객체의 배열로 정상적으로 반환됩니다. 예시:

groups: Array (5)
0 {
  id: 1, 
  name: "admins", 
  has_messages: false
}
1 {
  id: 46, 
  name: "custom-group", 
  has_messages: false
}
2 {
  id: 3, 
  name: "staff", 
  has_messages: false
}
3 {
  id: 10, 
  name: "trust_level_0", 
  has_messages: false
}
4 {
  id: 11, 
  name: "trust_level_1", 
  has_messages: false
}

그러나 _대부분_의 사용자의 경우, groups 배열은 단순히 비어 있습니다 (0).
해당 사용자들은 실제로 그룹의 멤버이므로, 왜 이런 일이 발생하는지 이해할 수 없습니다.
"기본(primary) 그룹"과 관련이 있는지 확인해 보았지만, groups 배열이 있는 사용자들도 어떤 기본 그룹에도 속해 있지 않으므로 이것이 문제가 되는 것은 아닙니다.

사용자 로그인을 처리하기 위해 WP SSO Connection을 사용하고 있습니다. 따라서 사용자는 WP 인스턴스에서 로그인하며, Discourse 인스턴스는 기본적으로 WP의 "슬레이브(slave)

현재 로그인된 사용자를 위한 세션 엔드포인트(session/current)를 사용하고 있습니다. 이 엔드포인트를 통해 “자동” 그룹(예: 신뢰 수준 그룹)을 받는 것은 스태프 멤버만 가능합니다.

이와 관련된 예시로 https://meta.discourse.org/g를 확인해 보세요. 엔드포인트는 다르지만 동일한 원리가 적용됩니다. 이 포럼의 스태프 멤버가 아니기 때문에 메타(meta)에서 모든 신뢰 수준 그룹을 볼 수 없다는 것을 확인할 수 있습니다.

모든 사용자 그룹, 특히 자동 그룹을 포함하여 모든 그룹을 가져오려면 API 키를 사용한 인증된 요청이 필요합니다. 이 자바스크립트가 워드프레스에서 실행되고 있다면, 이를 위해 WP Discourse 유틸리티 함수를 사용할 수 있습니다. 관리 인터페이스에서 제공한 API 키를 사용하여 요청을 수행하게 됩니다.

정말요? 그렇게 복잡할 거라고 생각하지 않는데요?


이것은 await $.ajax("/u/Lhc_fl.json")에서 가져온 것입니다.
물론 저는 메타의 스태프는 아니지만, 제 “자동” 그룹을 볼 수 있습니다

@Lhc_fl, 당신이 한 일은 현재 사용자의 사용자 이름(내 생각엔 내가 사용하는 것과 같은 AJAX로?)을 가져온 다음, 해당 사용자의 JSON으로 또 다른 AJAX 요청을 보내고, 거기서 그룹을 가져온 것이군요.

@angus의 접근 방식도 마음에 듭니다. 다만 제 코드는 discourse 쪽에 있긴 하죠… 그냥 동일한 API 키를 사용해서 인증하면 될까요?

withCredentials를 사용하므로, 코드는 사용자가 인증된 경우에만 실행되고, 데이터가 항상 동일할 것이라고 가정했습니다.

데이터가 왜 동일한지 모르겠습니다. 사용자가 속한 _그룹_을 전달하는 것이 보안상의 우려 사항인가요? 제가 보는 바로는, 실제 그룹 데이터나 해당 그룹의 다른 사용자를 전달하는 것은 아닙니다.

어쨌든, 제안된 접근 방식을 시도해 보겠습니다…

감사합니다!

Discourse용 컴포넌트를 개발 중이시라면… 가장 쉬운 방법은 Discourse API를 사용하는 것입니다. 클라이언트를 개발 중이시라면, 사용자 이름은 이미 오래전에 알려져 있어야 하지 않나요?

전자의 경우, 아래에 예시를 드립니다;

require("discourse/lib/plugin-api").withPluginApi("1.0.0", (api)=>{console.log(api.currentUser())});

현재 사용자 객체에 액세스할 수 있으며, 이를 통해 사용자가 자신이 속해 있다고 인식하는 그룹을 확인할 수 있습니다. 이 객체는 모든 사용자에게 이미 로드되어 있으므로, 현재 사용자를 참조하는 다른 테마와 동일한 방식으로 플러그인 API에 액세스할 수 있습니다. Theme Developer Quick Reference Guide를 참고하고 주변을 둘러보시면 예시를 찾을 수 있습니다.

이 주제와 관련된 권장 주제에도 예시가 있습니다: currentUser.groups doesn't match group_users table

모두 감사합니다

이 특정 인스턴스에서 groups는 여전히 비어 있습니다(현재 세션 대신 사용자 API를 사용해도 마찬가지입니다). 하지만 group_users에서 그룹 _ID_를 확인하는 방식으로 이 문제를 해결할 수 있었습니다. 이 테이블도 동일한 데이터를 저장하지만 이름이 아닌 ID를 사용하거든요.

저는 원래 접근 방식을 데이터 가져오기에 사용했습니다. 이 코드는 테마나 플러그인이 아니라 Discourse에 head 스크립트로 추가된 스니펫일 뿐이거든요.

실제 api는 작동하지 않았지만, AJAX 방식은 제가 필요한 용도에는 똑같이 잘 작동했습니다.

다시 한번 모두의 의견에 감사드립니다. 특히 제 경우에 맞는 올바른 해결책을 찾아주신 @Lhc_fl님께 감사드립니다.