Можем ли мы создать плагин и использовать пользовательскую конечную точку, аналогичную API,
создать токен с учетными данными пользователя, а затем сбросить пароль через API.
Пожалуйста, поделитесь лучшим способом выполнения этой задачи.
Я использую собственный скрипт для миграции пользователей Drupal в Discourse, но пароль сохраняется в виде хеш-строки, и пользователь не может войти с обычным паролем, например (admin@123).
Однако вход выполняется с использованием хеша пароля, например:
3sdfd32423@#423fdsfr.
Не могли бы вы немного пояснить, как работает встроенная функция в этом случае?
Это один из старейших сторонних плагинов (ему уже более 9 лет!), и он постоянно поддерживается и функционирует. Возможно, он не работает у вас, но решение состоит в том, чтобы выяснить, почему он не работает именно в вашем случае, а не искать обходные пути.
Не могли бы вы перефразировать это? Я не понимаю, что вы имеете в виду.
Мой сайт на Drupal хранит пароли пользователей в виде зашифрованного кода в базе данных. Я перенёс всех пользователей на платформу Discourse с помощью API Discourse. Я сформировал payload с данными пользователей и кодами паролей из базы данных Drupal и загрузил их в Discourse.
Я думал, что пользователи смогут использовать те же учётные данные для входа, что и на Drupal, но это не работает. Discourse не принимает реальный пароль пользователя, например “admin@123”. Вместо этого он использует хеш пароля, например “3sdfd32423@#423fdsfr”.
Discourse берёт коды паролей из Drupal и применяет к ним свой собственный алгоритм шифрования в своей базе данных.
Можете показать, как вы это сделали?
Если вы используете API, не следует использовать хеш Drupal в качестве пароля. Вместо этого хеш следует сохранить в пользовательском поле с именем import_pass. Не уверен, что это вообще возможно сделать через API.
Существует разница между созданием поля пользователя с таким именем и наличием пользовательского поля с таким именем. Поэтому хеш сохраняется в неправильном месте.
Проблема в том, что, по-моему, последнее (пользовательское поле) недоступно через 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