Сброс пароля с помощью пользовательского файла Ruby

Пользовательская функция для обновления пароля в Discourse

Можем ли мы использовать этот код для обновления пароля?

Например:
User.find_by(username: ‘gollum’).update!(password: ‘shiiiire!-BAGGINS!’)

Или

Можем ли мы создать плагин и использовать пользовательскую конечную точку, аналогичную API,
создать токен с учетными данными пользователя, а затем сбросить пароль через API.

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

Привет, Хитеш,

Какой у вас будет случай использования? Почему бы не использовать встроенную функцию?

Спасибо за ответ.

Я использую собственный скрипт для миграции пользователей Drupal в Discourse, но пароль сохраняется в виде хеш-строки, и пользователь не может войти с обычным паролем, например (admin@123).

Однако вход выполняется с использованием хеша пароля, например:
3sdfd32423@#423fdsfr.

Не могли бы вы немного пояснить, как работает встроенная функция в этом случае?

Вы уже посмотрели это? Возможно, это поможет:

Поддерживаются пароли Drupal 7:

Привет, @Canapin

Также я использовал этот плагин, но он не работает

Нет — всё работает.

Это один из старейших сторонних плагинов (ему уже более 9 лет!), и он постоянно поддерживается и функционирует. Возможно, он не работает у вас, но решение состоит в том, чтобы выяснить, почему он не работает именно в вашем случае, а не искать обходные пути.

Не могли бы вы перефразировать это? Я не понимаю, что вы имеете в виду.

Мой сайт на Drupal хранит пароли пользователей в виде зашифрованного кода в базе данных. Я перенёс всех пользователей на платформу Discourse с помощью API Discourse. Я сформировал payload с данными пользователей и кодами паролей из базы данных Drupal и загрузил их в Discourse.

Я думал, что пользователи смогут использовать те же учётные данные для входа, что и на Drupal, но это не работает. Discourse не принимает реальный пароль пользователя, например “admin@123”. Вместо этого он использует хеш пароля, например “3sdfd32423@#423fdsfr”.

Discourse берёт коды паролей из Drupal и применяет к ним свой собственный алгоритм шифрования в своей базе данных.

Можете показать, как вы это сделали?
Если вы используете API, не следует использовать хеш Drupal в качестве пароля. Вместо этого хеш следует сохранить в пользовательском поле с именем import_pass. Не уверен, что это вообще возможно сделать через API.

Я выполнил ваши шаги при установке плагина Discourse Migrate:

  • Сначала я установил плагин в свой Discourse, но не активировал его, а затем создал пользовательское поле с именем import_pass.

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

  • После загрузки пользователей в Discourse я активировал плагин и попытался войти в новое окно с учетными данными пользователя, но это не сработало.

Это явно не входит в перечень шагов.

Существует разница между созданием поля пользователя с таким именем и наличием пользовательского поля с таким именем. Поэтому хеш сохраняется в неправильном месте.

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

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

Это сработает, запустите из консоли Rails (отмечу вас, чтобы вы увидели правку @Hitesh_Sharma)

ufkey = "user_field_#{UserField.find_by(name: 'import_pass').id}"
User.all.each do |u|
  if u.custom_fields.key?(ufkey)
    u.custom_fields[:import_pass] = u.custom_fields[ufkey]
    u.custom_fields.delete(ufkey)
    u.save_custom_fields
  end
end