제 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로 변경하면 작동할 것 같습니다:
저는 외부 사이트에서 사용자 계정을 관리하지 않습니다. 여러 서비스(ESP 등)를 연결하는 Airtable + Zapier + GCFs 마스터 설정은 있지만, Discourse가 주요 사용자 데이터베이스입니다. Discourse의 일반 가입 양식은 전환율에 좋지 않고 블로그 게시물 등에 통합할 수 없어 이를 사용하고 싶지 않습니다. 사실 Jekyll 기반 콘텐츠 사이트의 SSO 제공자는 Discourse이며, Discourse에 사용자가 로그인되어 있는지 확인하기 위해 fetch 요청을 보내고, 그 결과에 따라 콘텐츠 페이지를 조정합니다.
이는 본질적으로 너무 위험하여 코어에서 제거되었던 기능을 다시 도입하는 것입니다. 초대 토큰을 잘못 다루게 되면, 의도된 수신자가 사용하기 전에 토큰을 탈취한 사람이 수신자로 사칭하여 포럼에 로그인할 수 있습니다. 따라서 관리자 또는 운영자 계정에 대해 이러한 형태의 초대를 사용하지 않는 것을 강력히 권장합니다.
이 기능을 처리하는 코드는 이미 존재하지만, 실제로 이를 사용하기 위해서는 몇 가지 커스텀 설정이 필요합니다.