Я настроил Discourse для использования Auth0 в качестве провайдера SSO. Проблема в том, что при регистрации пользователя ему приходят два письма с подтверждением: одно от Auth0 и одно от Discourse.
Термин SSO используется для нескольких различных методов аутентификации. Это не раз вызывало путаницу в прошлом.
Если вы используете реализацию SSO в Discourse, то проверка электронной почты контролируется параметром SSO require_activation. Установите этот параметр в значение "false", чтобы обойти проверку электронной почты.
Я хочу избежать полного отключения этой функции. В данный момент у меня настроено так, что require_activation возвращает true или false в зависимости от того, подтверждена ли учетная запись через Auth0. Это работает нормально: после того как пользователь перейдет по ссылке из письма Auth0, при следующем входе в Discourse он будет автоматически подтвержден.
Так что в идеале нужно просто отключить отправку письма, если только я что-то не упускаю.
Это имеет смысл. Наш плагин для WordPress обрабатывает проверку электронной почты аналогичным образом.
Если вы хотите узнать, как значение require_activation используется в Discourse, посмотрите этот файл: https://github.com/discourse/discourse/blob/master/app/models/discourse_single_sign_on.rb#L81. Вы увидите, что когда require_activation установлен в "false" при создании пользователя через SSO, в Discourse создается активный пользователь. Если же оно установлено в "true", пользователь не будет активирован, пока не перейдет по ссылке в письме с активацией от Discourse.
После того как пользователь установлен в статус active в Discourse, единственное, что может потребовать повторной активации, — это включение настройки сайта sso_overrides_email и обновление пользователем своего адреса электронной почты на стороне вашего провайдера SSO.
При значении "true" параметр require_activation также предотвращает сопоставление существующих пользователей в Discourse с пользователями вашего внешнего сайта по адресу электронной почты. Это может вызвать проблемы, если SSO внедряется после того, как пользователи уже были созданы на сайте с помощью входа по имени пользователя и паролю.
Чтобы письмо с подтверждением отправлялось только с сайта вашего провайдера SSO, пользователям необходимо зарегистрироваться на этом сайте и подтвердить свой адрес электронной почты до первого входа в Discourse. После этого вы сможете установить параметр require_activation в значение "false" для этих пользователей. Они будут созданы в Discourse как активные пользователи, и письмо с подтверждением от Discourse им отправлено не будет.
Это не имеет смысла. Как заставить их подтвердить электронную почту перед первым входом в Discourse?
Мой сайт уже занимается подтверждением электронной почты. Как отключить отправку писем для подтверждения в Discourse, но при этом отображать пользователю сообщение о необходимости аутентификации?
DiscourseConnect предполагает, что вы проверяете адреса электронной почты на своём сайте. Пока вы это делаете, не устанавливайте параметр require_activation в полезной нагрузке SSO. Если этого параметра нет в полезной нагрузке, пользователи будут автоматически входить в Discourse без отправки им письма с активацией.
Да, но тогда Discourse будет считать, что они прошли проверку, что может быть неверно, если пользователь зашёл на форум и забыл или решил не подтверждать адрес электронной почты. Если на веб-сайте параметр require_validation установлен в true, это означает, что пользователь ещё не подтвердил свой адрес на сайте, но ссылку для подтверждения он точно получил, поэтому Discourse не должен отправлять её снова. Однако из-за этого параметра он всё равно отправит.
По сути, проблема возникает только в том случае, если пользователь обращается к Discourse до подтверждения. Сейчас у меня, по сути, есть два варианта:
Пользователь получает только одно письмо с подтверждением, но Discourse будет считать его подтверждённым, что не идеально, так как он может не завершить процедуру подтверждения.
Пользователь получает два письма с подтверждением, но будет корректно подтверждён как форумом, так и веб-сайтом. Этот вариант тоже не идеален, но определённо лучше из двух.
Существует третий вариант: добавить переключатель, который работает только если включен SSO, отключая отправку письма с подтверждением из Discourse (но оставляя страницу ошибки, где пользователю сообщается, что он не подтверждён).
В идеале, когда пользователь создаёт учётную запись на вашем сайте, вы должны подтвердить его адрес электронной почты, попросив его ответить на письмо с активацией, которое отправляется с вашего сайта при регистрации пользователя. Если по какой-то причине вы разрешаете пользователям создавать учётные записи на вашем сайте до подтверждения их адреса электронной почты, вы можете условно установить параметр require_validation в полезной нагрузке SSO. Если пользователь подтвердил свой адрес электронной почты, установите require_validation в false или просто omitите этот параметр из полезной нагрузки. Если пользователь не подтвердил свой адрес электронной почты на вашем сайте, установите параметр require_activation в true, чтобы ему было отправлено письмо с активацией от Discourse.
Именно это я и делаю, и это проблема. Например, пользователь регистрируется, получает письмо с активацией с веб-сайта, но вместо того чтобы открыть его и активировать аккаунт, решает перейти в Discourse, почему бы и нет. Тогда require_activation будет установлен в true, так как пользователь ещё не активирован. Однако Discourse решит, что пользователю нужно отправить ещё одно письмо с активацией, что является проблемой, поскольку уже есть письмо с активацией от веб-сайта, ожидающее открытия. Discourse должен просто отобразить сообщение об ошибке, указывающее пользователю проверить свою электронную почту.