Ошибка входа

Всем привет! Один из пользователей нашего форума не может войти в свой аккаунт на форуме с нашего сайта и получает эту ошибку. С другими аккаунтами пользователей проблем нет, только с этим. Я думал, что проблему можно решить, обновив форум до последней версии, но она всё ещё сохраняется.

У кого-нибудь есть идеи? Буду благодарен за любую помощь.

Есть ли что-то особенное в вашей настройке входа или в этом конкретном пользователе? Мне кажется, я уже сталкивался с похожими ошибками, связанными с учетными записями администраторов, но чем больше информации вы предоставите, тем лучше. :+1:

Вы видите какие-либо ошибки в вашем файле /logs?

Спасибо за ваш ответ!
Вы имеете в виду логи в /var/discourse/shared/standalone/log/rails?

В каком логе записана такая ошибка?
production.log или production_errors.log?

Второй файл пуст.

Я имел в виду логи по адресу [YourSite]/logs или, возможно, что-то отображается в консоли браузера при попытке входа? Там может быть дополнительная информация, которая поможет сузить круг поиска.

Являются ли они обычным пользователем (не сотрудником), и включена ли у вас система единого входа (SSO)?

Да, я полагаю, что все пользователи могут войти через SSO, так как им не нужно вводить учетные данные и пароль для входа на форум. Они автоматически перенаправляются с веб-сайта на форум.

Вот ошибка в консоли:

А вот возможная запись об ошибке в логах веб-сервера:
ActiveRecord::RecordInvalid (validation failed: Primary email already adopted) app/models/discourse_connect.rb:270:in block in match_email_or_create_user' lib/distributed_mutex.rb:53:in block in synchronize’ lib/distributed

Кажется, у этого пользователя в Discourse указан другой адрес электронной почты, чем на вашем основном сайте. Не могли бы вы это проверить для подтверждения?

Да, я только что проверил: адрес электронной почты, отображаемый в панели пользователя Discourse, и адрес на нашем основном сайте совпадают.

Я провел небольшую проверку, и одна из возможных причин может заключаться в том, что их адрес электронной почты случайно попал в ваш список заблокированных. Вы можете выполнить поиск и убедиться в этом на странице /admin/logs/screened_emails. Если вы найдете их там, разблокировка может решить проблему. :+1: (также стоит проверить их IP-адрес в /admin/logs/screened_ip_addresses).

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

Я проверил /admin/logs/screened_ip_addresses, и там пусто.

Извините, я не понимаю, что вы имеете в виду. («Какой SSO вы используете?») Разве существует много типов SSO?

Мне было интересно, использовали ли вы Discourse Connect или что-то другое, и с чем именно вы его подключили для обеспечения аутентификации пользователей (например, с WordPress).

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

Это происходит, когда:

  • включена опция «требовать активацию» (require activation = true);
  • в Discourse есть пользователь U1 с определённым адресом электронной почты, возможно, с внешним ID A;
  • в провайдере DiscourseConnect есть пользователь U2 с тем же адресом электронной почты, но с другим внешним ID (B).

При входе пользователя Discourse проверяет, существует ли пользователь с внешним ID B. Если такого пользователя нет, то обычно Discourse выполняет сопоставление по адресу электронной почты. Однако, поскольку включена опция «требовать активацию», адрес электронной почты считается ненадёжным, и этот шаг пропускается. В результате пользователь не связывается с U1, так как это могло бы привести к захвату аккаунта.

Таким образом, Discourse решает создать нового пользователя. Однако это не удаётся, поскольку пользователь U1 уже существует с таким же адресом электронной почты.

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

Возможные решения:

  • если адреса электронной почты на стороне провайдера DiscourseConnect верифицированы и могут считаться надёжными, установите require_activation = false;
    или
  • измените внешний ID пользователя U1 на B;
    или
  • измените адрес электронной почты пользователя U1 на другой.

Добавляю текст «запрошенное изменение было отклонено», чтобы эта тема находилась при поиске по этой ошибке.

Да, мы используем Discourse Connect, и он подключен к нашему сайту.

Спасибо большое за ваш подробный ответ! Адреса электронной почты на нашем сайте проверяются при входе пользователя. Поэтому я сначала попробую решить проблему методом 1. Но в настройках администратора я не нашел, где находится опция «требовать активацию по электронной почте».

Это параметр, возвращаемый в процессе SSO, см. Disable email verification for SSO - #4 by simon

Для сайтов, использующих плагин WP Discourse для аутентификации, администраторы сайта также могут отмечать адреса электронной почты конкретных пользователей как подтверждённые на странице настроек пользователя:

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

Интересно, когда это началось. Я почти уверен, что описанная вами ситуация раньше приводила к следующему сообщению об ошибке: «В вашей учётной записи возникла проблема. Пожалуйста, свяжитесь с администратором сайта».

Здесь ещё один случай сбоя валидатора Rails, который возвращает эту ошибку, и он существует уже 6,5 лет. В контексте DiscourseConnect это действительно то, что мы наблюдаем лишь в последние несколько месяцев.

Мы используем образ Discourse, так что не стоит ли просто добавить require_activation=true в env:?

Спасибо за вашу помощь, но мы не используем WP. Мы используем образ Docker для Discourse. Правильный способ его настроить — добавить require_activation=true в секцию env: файла app.yml?

Нет, см. Login error - #17 by RGJ, как уже было указано ранее: этот параметр необходимо передавать для каждого пользователя отдельно. Если у вас кастомная реализация, это потребует изменения серверного кода.