초대된 사용자의 활성화 이메일 요구 사항 비활성화

여러분 안녕하세요. 현재 잘 지원되지 않는 사용 사례(use case)가 하나 있습니다. 초대받은 사용자의 활성화 이메일을 비활성화해야 하는데, 링크로 초대된 사용자도 포함해야 합니다.

위 토픽을 시작한 후 구현되었지만, 이메일로 초대된 사용자에 대해서만 적용됩니다.

제 Discourse 인스턴스는 초대 전용(invite-only)이며, 실제로는 내장된 Discourse 이메일이 아닌 이메일을 통해 초대 링크를 보내고 있습니다. /invites/link에 POST 요청을 보내 초대 링크를 생성하고 외부 DB에 저장한 뒤, 그곳에서 사용자에게 링크를 보내고 있습니다. 따라서 사용자가 링크를 클릭할 때 이미 이메일 인증을 마친 상태이지만, 다시 한 번 인증을 요구받게 됩니다.

제 사용 사례가 특별히 흔하지 않다는 점을 인지하고 있으므로, Discourse의 필요한 부분을 수정하여 제가 원하는 방식으로 작동하도록 간단한 플러그인을 만들어 보려고 합니다.

골격(skeleton)을 세팅하여 실행 중이며, 사이트 설정(no_activation_enabled)을 추가했습니다. 코어 저장소를 검색해 본 결과, 수정이 필요한 파일은 아마도 이것일 것 같습니다:

완전히 확신은 못 하겠지만, 조건부(예: SiteSetting.no_activation_enabled가 true이고, 사용자가 스태프에 의해 초대된 경우, 아마 invite.invited_by.staff?)로 user.attributes의 active를 true로 변경하면 작동할 것 같습니다:

    user.attributes = {
      email: invite.email,
      username: available_username,
      name: name || available_username,
      active: false,
      trust_level: SiteSetting.default_invitee_trust_level,
      ip_address: ip_address,
      registration_ip_address: ip_address
    }

하지만 플러그인에서 이 부분을 어떻게 변경할 수 있을까요? 플러그인이 할 수 있는 범위에 속하는 일인가요? 아니면 플러그인은 추가만 할 수 있고 수정은 할 수 없는 건가요? 아니면 invite_redeemer.rb 파일 전체를 대체해야 하나요?

플러그인 개발 입문 가이드와 이 가이드를 완료했지만, 다른 플러그인을 포함해 코드베이스를 몇 시간 동안 파고들어도 벽에 머리를 부딪는 것 같습니다… 만약 누군가 제게 힌트를 줄 수 있다면 정말 감사하겠습니다!

외부 사이트에서 이 작업을 처리하는 것이라면, SSO를 처리하고 인증 정보를 페이로드에 담아 전달하는 건 어떨까요?

스티븐, 의견 주셔서 감사합니다.

저는 외부 사이트에서 사용자 계정을 관리하지 않습니다. 여러 서비스(ESP 등)를 연결하는 Airtable + Zapier + GCFs 마스터 설정은 있지만, Discourse가 주요 사용자 데이터베이스입니다. Discourse의 일반 가입 양식은 전환율에 좋지 않고 블로그 게시물 등에 통합할 수 없어 이를 사용하고 싶지 않습니다. 사실 Jekyll 기반 콘텐츠 사이트의 SSO 제공자는 Discourse이며, Discourse에 사용자가 로그인되어 있는지 확인하기 위해 fetch 요청을 보내고, 그 결과에 따라 콘텐츠 페이지를 조정합니다.

안녕하세요, 오신 것을 환영합니다 :slight_smile:

@Stephen 님과 마찬가지로, 이것이 적절한 도구인지 확신은 없지만, 충분히 고민해 보셨을 것이라 믿습니다.

이것은 가능한 한 피해야 합니다. 클래스를 몽키 패치(monkey patch)해야 하는 경우를 제외하고는 거의 항상 다른 해결책이 있습니다. Discourse에서의 몽키 패치에 대해서는 다음 링크를 참고하세요: Override existing Discourse methods in plugins.

이 경우를 보면, 여러분이 집중하고 있는 메서드 안에 이미 여러분이 원하는 동작을 수행하는 코드가 있는 것 같습니다: discourse/app/models/invite_redeemer.rb at main · discourse/discourse · GitHub

문제는 생성하신 초대장이 올바른 emailed_status_type을 가지고 있지 않아 해당 조건을 통과하지 못한다는 점입니다. 저는 여기서 해결책은 애초에 다른 형태의 초대장을 생성하는 것이라고 생각합니다. 여기에 집중하시는 것이 좋습니다.

이는 본질적으로 너무 위험하여 코어에서 제거되었던 기능을 다시 도입하는 것입니다. 초대 토큰을 잘못 다루게 되면, 의도된 수신자가 사용하기 전에 토큰을 탈취한 사람이 수신자로 사칭하여 포럼에 로그인할 수 있습니다. 따라서 관리자 또는 운영자 계정에 대해 이러한 형태의 초대를 사용하지 않는 것을 강력히 권장합니다.

이 기능을 처리하는 코드는 이미 존재하지만, 실제로 이를 사용하기 위해서는 몇 가지 커스텀 설정이 필요합니다.