DiscourseConnect를 사용하지 않는 경우 discourse_username 입력

이것은 오래된 GitHub 이슈에 올라온 질문이며, 메타(meta)에서 더 쉽게 추적할 수 있습니다.

https://github.com/discourse/wp-discourse/issues/237

@mattdm 님의 글:

로그인에 OpenID를 사용하고 있는데, 해당 옵션이 DiscourseConnect를 사용할 때만 이용 가능한 것 같습니다. 다른 방법이 있을까요? 수동으로 입력하는 것은 꽤 번거롭습니다.

Discourse 사이트에서 사용자는 이메일 주소를 편집할 수 있습니다(SSO와 별개로). 하지만 사용자 ID는 동일하게 보장됩니다.

제 초기 답변(아직 해결되지 않은 질문이 있습니다)

@mattdm 님, 몇 가지 사항을 명확히 해 주시겠어요:

  1. 사용자의 이메일 주소가 WordPress와 Discourse 계정 간에 다를 수 있나요?
  2. "사용자 ID는 동일하게 보장된다"는 것은 무슨 뜻인가요? 어떤 사용자 ID를 말씀하시는 건가요?

아, 죄송합니다 — 전에 답변을 했다고 확신했는데… 그렇지 않았나 봅니다. 그냥 생각만 하고 있었던 것 같네요! 어쨌든:

  1. 이메일은 처음에 WordPress와 Discourse 모두 SSO에서 동기화됩니다. 하지만 많은 요청이 있어, Discourse에서 해당 이메일을 변경할 수 있도록 허용했습니다. (로그인에 직접 연결된 이메일 주소가 아닌 다른 곳으로 Discourse 알림을 보내고 싶어하는 경우가 꽤 잦은 것으로 드러났습니다.) WordPress에서도 이메일 주소를 변경할 수는 있지만, 그렇게 하는 사람이 있는지, 심지어 해당 인스턴스에서 나가는 이메일이 _동작하는지_조차 알지 못합니다.

  2. "user id"라고 한 것은 "username"을 의미했습니다. 사용자 이름은 항상[1] Discourse와 WordPress 모두 SSO에서 가져오며, 어떤 경우에도 사용자가 변경할 수 없습니다. 제게는 알 수 없는 이유지만, 당시에는 합리적이었을 가능성이 있습니다. SSO 쪽에서는 이것이 nickname으로 처리되며, oauth2 json username path에 매핑됩니다.


  1. 실제로 제 계정처럼 SSO를 도입하기 전에 설정된 일부 계정은 잘못된 상태입니다. 저는 mattdm 대신 "Matthew Miller"로 표시되어 있습니다. 하지만 이 부분은 정리할 수 있습니다. ↩︎

음, 알겠습니다. 즉, 실제로는

  1. WordPress와 Discourse에서 서로 다른 이메일을 사용하는 사용자 하위 집합이 존재하게 됩니다.
  2. WordPress와 Discourse 양쪽 모두에서 사용자 이름은 ID 제공자(Identity Provider)가 제공하는 것과 동일하게 보장됩니다.

WP Discourse 사용자 웹훅을 DiscourseConnect 기능과 분리할 수 있다면(가능합니다), 사용자 매칭은 사용자 이름이 아닌 이메일을 기준으로 이루어질 것입니다. 현재 상황은 귀하의 ID 설정에 다소 특이한 경우입니다.

이 경우를 처리하는 것이 더 나은 방법은 WordPress에서 사용자 정의 코드를 사용하는 것이라고 생각합니다. 원하시는 것은 다음과 같은 것입니다:

function update_discourse_username( $user_login, $user ) {
    update_user_meta( $user->ID, 'discourse_username', $user_login );
}
add_action( 'wp_login', 'update_discourse_username', 10, 2);

기본적으로 로그인 후 WP 사용자 이름을 discourse_username 메타 필드로 할당하면 됩니다. 두 값은 항상 동일하게 보장되므로요. 참고로 "user_login"은 WordPress 코드에서 "username"이라고도 불리는 것입니다.

몇 년이 지난 후 이 주제를 다시 꺼냅니다. :slight_smile:

어느 시점부터 이메일 주소를 (oauth2) SSO에서 강제로 동기화하도록 변경했습니다. 따라서 그 방식으로 매칭할 수 있을 것입니다. (그리고, 어떤 이유로든 불일치가 발생하더라도 이메일이 _다른 사람_에게 속하는 경우는 없어야 하므로, 최악의 경우에도 단순히 실패하는 것 외에는 문제가 되지 않겠죠?)

WP Discourse 사용자 웹훅이 제대로 작동하도록 만들 수 있을까요?

그렇지 않다면… 저는 WP 전문가가 아니어서, 그리고 저희 WP는 호스팅되고 있으므로 플러그인을 커스터마이징할 수 있는 쉬운 옵션이 있는지 확실하지 않습니다.

CC @jwheel

네, 확인 차 말씀드리면

이것이 더 이상 해당되지 않는다는 건가요?

현재는 정상적으로 작동하고 있다는 점 참고해 주세요. 새로운 기능을 요청하시는 것이죠 :slight_smile:

또한, 이 새로운 기능은 꽤 신중하게 고려해야 할 사항입니다. 몇 년 전에는 가능하다고 말씀드렸지만, 현재는 워드프레스에서 이메일 주소가 적절하게 검증된다는 전제를 해야 하므로, 이는 반드시 안전한 가정이 아니기에 플러그인의 핵심 기능으로 구현하는 데 다소 신중해지고 있습니다.

(워드프레스 이메일 검증)은 사이트 관리자의 책임이지만, 오픈 소스 개발의 원칙 중 하나는 환경에 대한 통제권이 없는 상황에서 일부 경우(아무리 작은 부분이라도) 나쁜 결과를 초래할 수 있는 것을 만들지 않는 것입니다. 이 문제는 여전히 존재하지만, DiscourseConnect로만 제한되면 완화됩니다.

더 자세히 검토한 후 이번 주 안에 다시 알려드리겠습니다.

이메일 매칭이 너무 복잡하다면, "Discourse 사용자 이름은 항상 WordPress와 일치한다(그리고 그 반대도 마찬가지)"는 그렇게 드문 일이 아니지 않을까 하는 느낌이 듭니다.

고유한 사용자 이름을 전제로 하는 SSO 시스템을 사용하지 않는 경우에도, 수십 명의 WordPress 사용자를 가진 작은 사이트들 중에는 이것이 관례상 참인 경우가 분명히 많을 것입니다.

이 문제에 대한 기존 솔루션이 어느 정도 있습니다. Discourse를 WordPress의 DiscourseConnect 제공자로 구성할 수 있습니다(일반적인 구성과 반대입니다). 설정이 쉽습니다. 활성화되면, 사용자의 이메일 주소를 기반으로 WordPress/Discourse 계정을 동기화할 수 있는 선택 사항이 있습니다.

사용자 프로필 페이지에 링크가 추가되기도 합니다:


(수정: 이미지에 AI 없이 캡션을 달 수 있나요?)

지금 테스트 중인데, 프로필 페이지의 링크를 클릭해도 Discourse 사용자 이름 필드가 입력되지 않습니다. 입력되어야 합니다. 로그인 페이지에 추가할 수 있는 “Discourse로 로그인” 링크를 클릭하면 Discourse 사용자 이름 필드가 자동으로 업데이트됩니다.

계정 동기화의 목적은 보안 방식으로 Discourse 사용자 이름 필드를 업데이트하는 것이므로, 이 부분에 대해 살펴볼 가치가 있을 것입니다. 또한, WordPress에서 “미확인” 이메일 주소를 가진 계정이 Discourse와 계정을 동기화하는 것이 허용되는 문제도 있는 것으로 보입니다. 기본적으로는 이것이 허용되지 않아야 합니다.

귀하의 경우, 사용자가 Discourse를 통해 WordPress에 로그인하는 것을 허용하지 않으실 수 있습니다. 프로필 페이지의 링크만 사용하여 사용자가 계정을 동기화하도록 허용하여 Discourse 사용자 이름 필드가 자동으로 입력되도록 하면 됩니다. 이를 위해 Discourse를 통한 WordPress 로그인을 활성화할 필요는 없습니다.

이 접근 방식의 가능한 단점은 사용자가 직접 시작해야 한다는 것입니다. 관리자가 사용자의 Discourse 사용자 이름을 가져오기 위해 클릭할 수 있는 버튼을 제공하지는 않습니다.

그건 좀 터무니없는 것 같습니다. 우리는 이미 중앙 집중식 SSO를 갖추고 있습니다. 서비스들이 함께 작동하도록 하려면 일부 서비스를 임의의 다른 서비스로 인증 제공자로 설정해야 한다는 건 말이 안 됩니다. 그건 미치광이가 되는 길입니다.

이름(DiscourseConnect)에 현혹되지 마세요. 제가 설명한 기능이 정상적으로 작동한다면, 이는 WordPress 사용자가 이메일 주소가 일치하는 Discourse 계정이 있는지 확인하고, WordPress에서 Discourse 사용자 이름이 자동으로 입력되도록 하는 방법일 뿐입니다. 이는 사이트의 인증 시스템에 영향을 주지 않습니다.

핵심 플러그인에는 설정 옵션을 통해서도 워드프레스 사용자 이름과 디스커스 사용자 이름의 매칭 식별 메커니즘이 절대 도입되지 않을 것입니다. 이 맥락에서 유일한 가능성은 이메일 매칭입니다. 저는 사용자 웹훅에 이메일 매칭을 폴백 메커니즘으로 추가하기로 결정했습니다. 이 기능은 몇 주 안에 나올 다음 버전에서 제공됩니다.

이 문제를 마무리하기 위해, 플러그인의 최신 버전 2.5.4에는 Webhooks 관련 다양한 업데이트가 포함되어 있습니다. 여기에는 “Match Users by Email” 설정에 대한 DiscourseConnect 요구 사항을 제거하는 것도 포함됩니다. 자세한 내용은 아래를 참고하세요.

생각컨대 이는 우리의 문제를 해결해 줄 것 같습니다. 적어도 99%의 경우에서는요. 감사합니다!!!

@jwheel 참고로 우리 사이트에서 이 기능을 켜 두었습니다.

좋아요, 플러그인 관련 향후 주제에 대해 주의를 기울일게요.