안녕하세요,
저는 Discourse를 설정하여 Auth0를 SSO 제공자로 사용하도록 했습니다. 그런데 문제가 하나 있습니다. 사용자가 가입할 때 인증 메일이 두 통이 발송됩니다. 하나는 Auth0에서, 다른 하나는 Discourse에서 발송됩니다.
Discourse에서 발송되는 인증 메일을 비활성화할 방법이 있을까요?
미리 감사드립니다.
안녕하세요,
저는 Discourse를 설정하여 Auth0를 SSO 제공자로 사용하도록 했습니다. 그런데 문제가 하나 있습니다. 사용자가 가입할 때 인증 메일이 두 통이 발송됩니다. 하나는 Auth0에서, 다른 하나는 Discourse에서 발송됩니다.
Discourse에서 발송되는 인증 메일을 비활성화할 방법이 있을까요?
미리 감사드립니다.
이메일 주소가 Auth0에 의해 인증되는 경우, oauth2 email verified 사이트 설정을 선택하여 Discourse 인증 이메일을 비활성화할 수 있습니다. 해당 설정에 대한 참조가 있는 게시글은 다음과 같습니다: Configure sign up and log in with Auth0 using the OAuth2 Basic Plugin - #33 by blake.
@simon님 답변 감사합니다. 하지만 저는 OAuth2가 아니라 SSO를 사용 중입니다.
SSO라는 용어는 몇 가지 다른 인증 방식에 대해 사용됩니다. 이로 인해 과거에 몇 번의 혼란이 발생했습니다.
Discourse의 SSO 구현을 사용하고 있다면, 이메일 인증은 require_activation SSO 파라미터에 의해 제어됩니다. 이메일 인증을 우회하려면 해당 파라미터를 "false"로 설정하세요.
다시 한번 @simon 님 감사합니다.
기능을 완전히 비활성화하는 것은 피하고 싶습니다. 현재 require_activation이 auth0로 인증되었는지에 따라 true 또는 false를 반환하도록 설정해 두었습니다. 이 방식은 잘 작동하며, auth0 이메일을 클릭한 후 다음 로그인 시 discourse에서 인증이 완료됩니다.
따라서 이상적으로는 이메일 전송을 억제하는 것만 하면 될 것 같습니다. 제가 놓친 부분이 있다면 알려주세요.
그렇군요. 저희 WordPress 플러그인도 이메일 인증을 같은 방식으로 처리합니다.
Discourse에서 require_activation 값이 어떻게 사용되는지 확인하려면 이 파일을 살펴보세요: https://github.com/discourse/discourse/blob/master/app/models/discourse_single_sign_on.rb#L81. SSO를 통해 사용자가 처음 생성될 때 require_activation이 "false"로 설정되어 있으면, Discourse가 활성(active) 상태의 사용자를 생성합니다. "true"로 설정되어 있으면, 사용자가 Discourse 활성화 이메일의 링크를 클릭할 때까지 활성화되지 않습니다.
Discourse에서 사용자가 active 상태로 설정된 후에는, sso_overrides_email 사이트 설정을 활성화해 두었고 사용자가 SSO 제공업체 사이트에서 이메일 주소를 변경한 경우에만 사용자가 다시 활성화되어야 하는 상황이 발생할 수 있습니다.
"true"로 설정된 경우, require_activation은 이메일 주소를 기준으로 기존 사용자와 외부 사이트의 사용자를 일치시키는 것을 Discourse에서 방지합니다. 이는 사용자가 이미 사용자명/비밀번호 방식으로 사이트에 생성된 후에 SSO가 구현된 경우 문제를 일으킬 수 있습니다.
그렇게 하면 이해가 갑니다. 하지만 Discourse에서 발송되는 “이메일 인증” 메일을 어떻게 막는지 잘 모르겠어요.
저는 auth0에서 발송되는 메일만 보내지 싶습니다.
인증 이메일이 SSO 제공자 사이트에서만 발송되려면, 사용자가 Discourse에 처음 로그인하기 전에 해당 사이트에 가입하고 이메일 주소를 인증해야 합니다. 그러면 해당 사용자의 require_activation 매개변수를 "false"로 설정할 수 있습니다. 이렇게 하면 사용자는 Discourse에서 활성 상태로 생성되며, Discourse 활성화 이메일을 받지 않게 됩니다.
이건 말이 안 되네요. Discourse에서 첫 로그인 전에 이메일 인증을 어떻게 하게 할 수 있나요?
제 웹사이트에서는 이미 이메일 인증을 처리하고 있는데, Discourse가 인증 이메일을 보내지 않도록 하되, 사용자가 인증이 필요하다는 메시지를 보도록 하는 방법은 무엇인가요?
DiscourseConnect는 웹사이트에서 이메일 주소를 검증하고 있다고 가정합니다. 이메일 주소를 검증하고 있다면, SSO 페이로드에 require_activation 매개변수를 설정하지 마세요. 페이로드에 해당 매개변수가 없으면 활성화 이메일이 전송되지 않고 사용자가 Discourse에 로그인됩니다.
네, 하지만 그러면 Discourse가 이미 검증된 것으로 간주하게 되는데, 사용자가 포럼에 접속한 후 이메일 검증을 잊거나 검증을 진행하지 않기로 결정한 경우라면 사실과 다를 수 있습니다. 웹사이트가 require_validation을 true로 설정하면, 사용자가 웹사이트에서 이메일을 아직 검증하지 않았다는 의미이지만, 검증 링크는 확실히 받은 상태이므로 Discourse가 다시 보내줄 필요가 없습니다. 하지만 이 파라미터 때문에 Discourse가 다시 보내게 됩니다.
기본적으로 이 문제는 사용자가 검증을 완료하기 전에 Discourse에 접속할 때만 발생합니다. 따라서 현재로서는 두 가지 옵션 중 하나를 선택해야 합니다:
세 번째 옵션도 있습니다: SSO가 활성화된 경우에만 작동하는 스위치를 추가하여 Discourse의 검증 이메일 전송을 비활성화하는 것입니다(다만, 사용자가 검증되지 않았음을 알려주는 오류 페이지는 유지합니다).
이상적으로는 사용자가 웹사이트에서 계정을 생성할 때, 사용자가 가입할 때 웹사이트에서 발송되는 활성화 이메일에 응답하도록 하여 이메일 주소를 인증해야 합니다. 만약 어떤 이유로든 사용자가 이메일 주소를 인증하기 전에 웹사이트에서 계정을 생성할 수 있도록 허용하는 경우, SSO 페이로드에서 require_validation 매개변수를 조건부로 설정할 수 있습니다. 사용자가 이메일 주소를 인증했다면 require_validation을 false로 설정하거나 페이로드에서 해당 매개변수를 생략하면 됩니다. 사용자가 웹사이트에서 이메일 주소를 인증하지 않았다면, Discourse에서 활성화 이메일이 발송되도록 require_activation 매개변수를 true로 설정해야 합니다.
제가 정확히 그렇게 하고 있고, 이것이 문제입니다. 예를 들어, 사용자가 가입한 후 웹사이트에서 활성화 이메일을 받지만, 이를 열어 활성화하는 대신 그냥 Discourse로 접속합니다. 왜 그러냐고요? 그냥 그러고 싶어서요. 그러면 아직 활성화되지 않은 상태이므로 require_activation이 true로 설정됩니다. 하지만 Discourse는 사용자에게 또 다른 활성화 이메일이 필요하다고 판단하게 되는데, 이는 웹사이트에서 온 활성화 이메일이 이미 열기만을 기다리고 있는 상황에서 문제가 됩니다. Discourse는 사용자가 이메일함을 확인하라는 오류 메시지를 표시하는 것만 하면 됩니다.