Как автоматически подтвердить дополнительный адрес электронной почты?

Я видел несколько тем, затрагивающих эту проблему, но ни одна из них не решает её до конца.

Вкратце: нашу компанию выкупили. Это означает, что все пользователи перейдут с @old_company.com на @new_company.com.

У меня есть карта соответствия старых и новых адресов электронной почты. Я хотел бы добавить для пользователя адрес @new_company.com и автоматически подтвердить его. Иначе им самим придётся проходить процедуру подтверждения по электронной почте, что в реальности вряд ли произойдёт.

Есть ли способ добавить дополнительный адрес электронной почты как администратор и автоматически его подтвердить?

Саймон упоминает следующее:

Однако мне не совсем понятно, как это работает. Как можно синхронизировать адрес электронной почты с учётной записью, если этот адрес ещё не подтверждён? Это означает, что мне следует/можно:

  1. добавить дополнительный адрес электронной почты для пользователя через API
  2. (возможно) отключить исходящую электронную почту на 10 минут, чтобы письмо с подтверждением не было отправлено
  3. включить saml sync email
  4. учётные записи пользователей подтвердят и обновят данные при входе через SAML

Примечание: в этом примере мы также меняем провайдера SAML

Даже если дополнительный адрес электронной почты ещё не подтверждён, означает ли описанная выше настройка, что при первой попытке входа с этим адресом он будет автоматически подтверждён и привязан к учётной записью?

image

Кстати, одна проблема, которую я неправильно понял, касалась подтверждающего письма. Как администратор, вы получаете два письма: одно для подтверждения старого адреса электронной почты, а второе — для подтверждения изменения.

Я предположил, что это относится ко всем пользователям, но с настройкой, показанной на изображении выше, можно установить её так, чтобы она применялась только к сотрудникам. Это означает, что пользователи будут получать только одно письмо для подтверждения изменения.

Однако всё ещё нужно разобраться, как автоматически подтверждать адрес электронной почты для пользователя :thinking:

Не уверен, что есть способ автоматически подтвердить это через UI/API. :thinking: Думаю, если используется SSO, то подтверждение email/идентичности осуществляется ими? В таком случае использование sso_sync загрузит уже подтверждённые данные/email и будет считать их «надёжными».


После небольшой проверки фактов… :slight_smile:

/admin/users/sync_sso предназначен только для DiscourseConnect. Я думаю, вы уже об этом знали, но проговорю это вслух для тех, кто будет читать это позже.

Однако также существует административная настройка auth_overrides_emails, которая может быть полезна в данном случае.

По сути, если ваш провайдер SAML отправляет подтверждённый email, и включена настройка auth_overrides_emails, Discourse начнёт использовать новый email без необходимости отправки письма для подтверждения. :+1:

Это не прямой ответ на ваш вопрос, но: в случае массового переименования адресов электронной почты вы можете сделать это через rails console:

o = "@old_company.com" 
n = "@new_company.com"
UserEmail.where("email LIKE ?","%#{o}").each do |ue| 
  ue.email.sub! o,n 
  ue.save! 
end

Если вы предпочитаете добавить дополнительный адрес электронной почты:

o = "@old_company.com" 
n = "@new_company.com"

UserEmail.where("email LIKE ?","%#{o}").each do |ue|
   sm = UserEmail.new
   sm.user_id = ue.id
   sm.email = ue.email.sub! o,n
   sm.save!
end

Спасибо за предложения. Я попробовал их следующим образом:

1. Добавление второго адреса электронной почты пользователю через API

Адрес электронной почты не подтверждён, но привязан к аккаунту

2. Настройка следующих параметров:

image

image

image

  • Я забыл установить параметр синхронизации SAML в true, однако, думаю, это не повлияло бы на результат. Проблема всё ещё, похоже, заключается в конфликте подтверждения адреса электронной почты.

3. Результат

В результате был создан новый аккаунт пользователя на основе нового корпоративного адреса электронной почты. В худшем случае я мог бы объединить их, но это действительно неприятный сценарий.

Я всё ещё вижу неподтверждённый адрес электронной почты в старом аккаунте. Я попытался повторно отправить подтверждение, чтобы посмотреть, что произойдёт, но получил ошибку 403 (Forbidden).

Похоже, что адрес электронной почты нужно подтвердить сначала, прежде чем мы сможем их синхронизировать :confused:

Если я ничего не упускаю, похоже, мне нужен способ подтвердить второй адрес электронной почты.

Интересно, сохраняется ли здесь та же проблема с подтверждением, или адреса считаются подтверждёнными по умолчанию? Дополнительная сложность заключается в том, что изменилась и часть адреса до символа @ (имя пользователя) в user@company.com. Но я подозреваю, что это означает необходимость пройтись по CSV-файлу с сопоставлениями между старыми и новыми адресами электронной почты.

Я скорее думал о смене email в SSO, включении auth overrides emails, а затем о входе в ваш аккаунт через ваш SSO как обычно.

Возможно, я что-то упустил.

Кажется, происходит именно это: система проверяет учётную запись SAML на основе адреса электронной почты и сервера SAML, использованного для входа. Проблема в том, что это совершенно другой провайдер идентификации SAML (новая компания).

В результате система корректно переопределяет/создаёт email как SAML-адрес, но делает это для новой учётной записи, поскольку учётная запись Discourse не связана с этим новым адресом.

Однако, если у существующей учётной записи в Discourse уже подтверждён новый SAML-адрес электронной почты, то вход проходит гладко, и этот адрес становится новым email для входа через SAML.

Хм. :thinking: Мне кажется, я исходил из предположения, что при переходе на новый IDP они будут сопоставлены на основе какого-то внешнего идентификатора.

Думаю, можно активировать/подтвердить электронную почту через консоль Rails, добавив информацию о токене. Что-то вроде:

old_domain = "<вставьте_здесь_старый_домен>"
new_domain = "<вставьте_здесь_новый_домен>"

users = UserEmail.where("email like '%" + old_domain + "'")

users.each do |user_email|
    user = User.find_by_id(user_email.user_id)
    user.email = user.email.gsub(old_domain, new_domain)
    user.email_tokens.create(email: user.email)
    user.activate
    user.save!
    puts "."
end

Насколько мне известно, этого не произошло. Для другой платформы нам пришлось самостоятельно получить список адресов электронной почты и выполнить сопоставление.

Всё больше и больше похоже, что это правильный путь. Поскольку мы размещены у вас, я передам эту информацию нашему менеджеру по работе с клиентами (CSM) и буду следить за развитием темы.