안녕하세요, 사용자가 속한 그룹을 가져오는 방법을 찾고 있습니다. get_discourse_user 함수를 통해 이 정보를 얻을 수 있을 것 같은데, 해당 함수는 그룹 데이터를 반환하지 않는 것 같습니다. 이 게시물에 따르면 반환되어야 하는 것 아닌가요?
WP Discourse 함수 get_discourse_user를 호출하고 계신가요? 그렇다면 "groups" 배열에 사용자의 그룹이 반환되어야 합니다.
네, 이렇게 호출하고 있습니다.
$discourseUser = \WPDiscourse\Utilities\Utilities::get_discourse_user( $current_user->ID, true );
var_dump($discourseUser);
그리고 이 결과가 반환됩니다.
object(stdClass)#2784 (25) { ["id"]=> int(7) ["username"]=> string(4) "chad" ["name"]=> string(13) "Chad Campbell" ["avatar_template"]=> string(59) "https://avatars.discourse.org/v4/letter/c/ecccb3/{size}.png" ["active"]=> bool(true) ["admin"]=> bool(false) ["moderator"]=> bool(false) ["last_seen_at"]=> string(24) "2019-10-25T15:59:45.439Z" ["last_emailed_at"]=> string(24) "2019-10-25T15:49:07.084Z" ["created_at"]=> string(24) "2019-10-24T21:22:40.526Z" ["last_seen_age"]=> float(2659.60627934) ["last_emailed_age"]=> float(3297.96116042) ["created_at_age"]=> float(69684.5193464) ["username_lower"]=> string(4) "chad" ["trust_level"]=> int(1) ["manual_locked_trust_level"]=> NULL ["flag_level"]=> int(0) ["title"]=> NULL ["suspended"]=> bool(false) ["time_read"]=> int(0) ["staged"]=> bool(false) ["days_visited"]=> int(2) ["posts_read_count"]=> int(0) ["topics_entered"]=> int(0) ["post_count"]=> int(0) }
함수 호출의 true 매개변수는 WordPress 사용자 ID를 기반으로 사용자가 발견되지 않은 경우, 이메일 주소로 Discourse에서 사용자를 검색하도록 함수를 동작시킵니다. 이는 사용자가 아직 SSO로 Discourse에 로그인하지 않았음을 의미합니다. 이메일 주소 기반으로 사용자가 발견되면, WordPress ID 기반으로 발견되는 경우보다 Discourse에서 반환되는 정보가 적습니다.
반환 값을 더 명확하게 만들도록 함수를 개선할 수 있을 것입니다. 당분간 응답에 groups 배열이 없으면, 사용자가 이메일 주소 기반으로 발견되었음을 알 수 있습니다.
알겠습니다. 설명해 주셔서 감사합니다, 시몬!
Simon, 안녕하세요.
SSO를 통해 Discourse에 로그인했는데, 이메일 파라미터를 false로 설정하면 이 오류가 표시됩니다.
object(WP_Error)#2718 (2) { ["errors"]=> array(1) { ["wpdc_response_error"]=> array(1) { [0]=> string(42) "The Discourse user could not be retrieved." } } ["error_data"]=> array(0) { } }
True로 설정해도 여전히 그룹이 반환되지 않습니다.
SSO 설정이 Wordpress와 Discourse에 모두 로그인되도록 하고 있으며(Wordpress를 통해 양쪽 모두 로그아웃도 가능), 모든 것이 정상적으로 작동한다고 생각했지만, 여전히 반환되는 그룹을 볼 수 없어 다소 혼란스럽습니다.
함수 호출의 두 번째 매개변수를 false로 설정하거나, 매개변수를 생략하면(기본값이 false입니다) 해당 함수는 WordPress ID를 사용하여 Discourse에서 사용자를 검색하려고 시도합니다. 사용자가 SSO로 Discourse에 로그인한 경우, 이 함수는 사용자와 해당 사용자의 그룹을 반환해야 합니다.
이를 디버깅하려면 검색하려는 사용자의 Discourse 관리자 페이지로 이동하세요. 페이지 하단으로 스크롤하여 Single Sign On 섹션이 있는지 확인하십시오. 해당 섹션이 있는 경우, 그 섹션의 External ID가 get_discourse_user 호출에 사용 중인 WordPress 사용자 ID와 일치하는지 확인하세요.
사용자의 Discourse 관리자 페이지에 Single Sign On 섹션이 없다면, 해당 사용자는 아직 SSO로 Discourse에 로그인하지 않은 것입니다.
네, 테스트해 본 사용자들 중 어느 누구에게도 해당 섹션이 존재하는지 확인되지 않습니다.
정말 SSO를 통해 로그인하는 것 같긴 합니다.
다음은 로그인 흐름입니다. (Wordpress나 Discourse에 로그인되지 않은 상태)
Wordpress에서 Discourse로 로그인 링크를 클릭합니다.
Discourse 사이트로 이동합니다.
Discourse 자격 증명(계정 정보)로 로그인합니다.
성공적으로 Wordpress 사이트로 리다이렉트됩니다.
이제 두 사이트 모두에 로그인된 상태가 됩니다.
공식적으로 SSO로 인식받기 위해 프로세스에서 무엇을 놓치고 있는 건가요?
이제 문제를 파악했습니다. WordPress에 대해 Discourse를 SSO 제공자로 사용 중이시네요. 해당 기능은 WordPress가 Discourse의 SSO 제공자로 사용될 때 의도된 것입니다. 기능 이름이 잘 지어지지 않았습니다. 사용 사례가 명확히 드러나도록 이름이 지어졌어야 합니다.
Discourse가 WordPress의 SSO 제공자로 사용되는 경우, /admin/users/$user_id.json으로 인증된 API 요청을 보내야 합니다. $user_id는 해당 사용자의 Discourse ID로 설정해야 합니다. Discourse를 통해 WordPress에 로그인한 사용자의 경우, 다음 방법으로 Discourse 사용자 ID를 가져올 수 있습니다:
get_user_meta( $wp_user_id, 'discourse_sso_user_id', true );
아, 알겠습니다. API 문서를 자세히 살펴보겠습니다. 방향을 잘 알려주셔서 감사합니다!