Restablecer contraseña con archivo ruby personalizado

Función personalizada para actualizar la contraseña en Discourse

¿Podemos usar este código para actualizar la contraseña?

p. ej.:-
User.find_by(username: ‘gollum’).update!(password: ‘shiiiire!-BAGGINS!’)

¿O podemos crear un plugin personalizado y usar un endpoint personalizado como la API y crear un token con las credenciales del usuario y luego restablecer la contraseña con la API?

Por favor, comparte la mejor manera de hacer esta tarea.

Hola Hitesh,

¿Cuál sería tu caso de uso? ¿Por qué no usar la función integrada?

1 me gusta

Gracias por tu respuesta.

Estoy utilizando un script personalizado para migrar usuarios de Drupal a Discourse, pero la contraseña se guarda como una cadena hash y el usuario no puede iniciar sesión con una contraseña confiable como (admin@123).

Pero sí inicia sesión con su hash de contraseña, como por ejemplo:
3sdfd32423@#423fdsfr

¿Podrías explicar un poco sobre la función integrada?

¿Has echado un vistazo a esto? Podría ayudar:

Soporta contraseñas de Drupal 7:

1 me gusta

Hola @Canapin

Además, usé este plugin pero no funciona.

No, está funcionando.

Este es uno de los plugins de terceros más antiguos que existen (¡tiene más de 9 años!) y se ha mantenido y ha estado funcionando todo el tiempo. Puede que no esté funcionando para ti, pero la forma de solucionarlo es encontrar por qué no está funcionando para ti en lugar de intentar una ruta alternativa.

¿Puedes reformular esto? No entiendo lo que dices.

¿Mi sitio web de Drupal está almacenando las contraseñas de los usuarios en un código cifrado y guardándolas en una base de datos? Moví a todos los usuarios a una plataforma llamada Discourse usando una API de Discourse. Creé una carga útil con sus detalles de usuario y códigos de contraseña de la base de datos de Drupal y los puse en Discourse.

Pensé que los usuarios podrían usar los mismos detalles de inicio de sesión en Drupal, pero no funciona. Discourse no acepta la contraseña real del usuario, como “admin@123”. En cambio, utiliza un código hash de contraseña de usuario como “3sdfd32423@#423fdsfr”.

Discourse toma los códigos de contraseña de Drupal y los introduce en su propio algoritmo cifrado en su propia base de datos.

¿Puedes mostrarnos cómo lo hiciste?
Si has estado usando la API, no deberías establecer el hash de Drupal como contraseña. Deberías establecer el hash como un campo de usuario personalizado llamado import_pass. No estoy seguro de si eso es posible usando la API.

1 me gusta

Seguí tus pasos al instalar el plugin Discourse Migrate

  • Primero instalé el plugin en mi discourse pero no lo habilité, luego creé un campo personalizado en discourse con el nombre import_pass

  • En el payload, agregué el hash de la contraseña almacenado en este campo personalizado

  • Después de que el usuario se sube a discourse, habilito el plugin e inicio sesión en una nueva ventana con las credenciales del usuario, pero no lo hicieron

Esto es explícitamente no parte de los pasos.

Hay una diferencia entre crear un campo de usuario con ese nombre y tener un campo personalizado con ese nombre. Por lo tanto, el hash se está almacenando en el lugar equivocado.

El problema es que creo que este último (un campo personalizado) no es accesible a través de la API.
Creo que la mejor manera de avanzar es tener algún código personalizado único que mueva el contenido del campo de usuario al campo personalizado real.

(Consideré cambiar el plugin para que también mire el campo de usuario, pero creo que exponer esos hashes a la interfaz de usuario es un riesgo de seguridad, así que no lo haré).

Esto funcionará, ejecútalo desde una consola de rails (etiquetándote para que veas la edición @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
2 Me gusta