Cambiando el correo electrónico de un usuario

Estoy un poco confundido sobre el proceso cuando un administrador cambia la dirección de correo electrónico de un usuario.

Hay algunas cosas que simplemente no entiendo, y además hay un error (por eso publico esto en bug y no en Support).

Cuando un administrador cambia el correo electrónico de un usuario desde la página de preferencias de ese usuario:

  • No se enviará un correo electrónico al usuario para confirmar el cambio de su dirección de correo. En su lugar, se le enviará un correo de restablecimiento de contraseña para que pueda establecer la contraseña de su cuenta en la nueva dirección de correo.
  • Se seguirá enviando un correo electrónico al usuario a su antigua dirección para informarle que se ha realizado el cambio.

#1 No entiendo por qué se envía un correo de restablecimiento de contraseña (“para que puedan establecer la contraseña de su cuenta”). ¿Acaso no necesitan cambiar su contraseña? Además, la experiencia de usuario es confusa: el usuario no espera un correo de restablecimiento de contraseña, no hay texto explicativo adjunto y el mensaje simplemente dice “Alguien solicitó restablecer tu contraseña en [nombre del foro]”.

#2 Ese correo de restablecimiento de contraseña se envía a la dirección antigua en lugar de a la nueva dirección de correo.

Aunque el correo electrónico del usuario se actualiza en update_user_email en la línea 46, el objeto @user no se vuelve a cargar y aún contiene la dirección de correo antigua.

#3 Si el administrador es el usuario que realiza la acción y el usuario afectado no es personal, no se envía ningún correo de confirmación según la especificación anterior. Sin embargo, después de cambiar la dirección de correo, el administrador recibe el siguiente mensaje de éxito: “Hemos enviado un correo electrónico a esa dirección. Por favor, sigue las instrucciones de confirmación”.

#4 ¿Por qué el usuario no necesita confirmar su nueva dirección de correo electrónico? La solicitud de extracción hace referencia a este tema, pero parece que faltan muchas publicaciones en él. No obstante, el tema aún menciona: “Para un usuario normal, la única dirección de correo electrónico que debe verificarse es la NUEVA dirección de correo”. EDICIÓN: oh, espera, ver #6 / #7.

#5 Este proceso, en el que un administrador cambia el correo electrónico de un usuario, se utiliza típicamente cuando la antigua dirección de correo ya no es accesible (¿supongo?). ¿Por qué aún se envía una notificación a la dirección antigua?

#6 Cuando este usuario intenta iniciar sesión, aparece una ventana emergente:

Todavía no puedes iniciar sesión. Anteriormente te enviamos un correo de activación a la antigua dirección de correo. Por favor, sigue las instrucciones de ese correo para activar tu cuenta.

  • No se ha enviado tal correo
  • Se menciona la antigua dirección de correo

Al presionar el botón “Reenviar”, dice:

Hemos enviado otro correo de activación a la nueva dirección de correo. Puede tardar unos minutos en llegar; asegúrate de revisar tu carpeta de correo no deseado.

#7 Ese correo de activación efectivamente llega a la nueva dirección de correo y lleva el título “confirma tu nueva cuenta” (y no “confirma tu nueva dirección de correo”).

¿No debería ser simplemente esto:

Se envía un correo electrónico a la nueva dirección de correo indicando: “Tu dirección de correo ha sido cambiada por [nombre del administrador]. Por favor, haz clic en el siguiente enlace para confirmar [enlace]”.

Edición: #8 La dirección de correo puede ser cambiada por un administrador desde el perfil público del usuario (/u/username), pero no desde la página de administración de ese usuario (/admin/users/id/username). Esto es contra intuitivo.

10 Me gusta

¿Podemos reproducir esto, @tshenry? ¿Hemos tenido una regresión aquí?

2 Me gusta

Comenzaré describiendo el flujo actual tal como lo veo (la mayoría, si no todos, coinciden con lo que @RGJ detalló):

  1. El administrador va a las preferencias de un usuario que no es personal y cambia su dirección de correo electrónico:

    Una vez enviado, el administrador ve el siguiente mensaje:

    Hemos enviado un correo electrónico a esa dirección. Por favor, sigue las instrucciones de confirmación.

  2. El mensaje anterior no parece preciso, ya que se envían DOS correos electrónicos a la dirección de correo antigua:

    [Demo] Tu dirección de correo electrónico ha sido cambiada

    Este es un mensaje automatizado para informarte de que tu dirección de correo electrónico para
    Demo ha sido cambiada. Si esto se hizo por error, por favor contacta a
    un administrador del sitio.

    Tu dirección de correo electrónico ha sido cambiada a:

    nuevo@email.com

    [Demo] Restablecimiento de contraseña

    Alguien solicitó restablecer tu contraseña en Demo.

    Si no fuiste tú, puedes ignorar este correo electrónico de forma segura.

    Haz clic en el siguiente enlace para elegir una nueva contraseña:
    https://example.discourse.site/u/password-reset/74d53d7d2cf20dsbc360614844c653s2

  3. He probado tres escenarios diferentes desde este punto. Cada punto representa un escenario independiente:

    • El usuario tiene acceso al correo electrónico antiguo y sigue el enlace de restablecimiento de contraseña. Al actualizar su contraseña, inicia sesión. Desde allí, puede iniciar sesión con su nombre de usuario o con la dirección de correo ANTIGUA. La nueva dirección de correo no parece estar activa en este momento.

    • El usuario intenta iniciar sesión con su nombre de usuario o con la dirección de correo nueva y recibe lo siguiente:

      Opción 1: Al hacer clic en “Reenviar”, se muestra el siguiente mensaje (nota que esta vez menciona la nueva dirección de correo):

      Efectivamente se envía un correo electrónico a la dirección de correo nueva:

      [Demo] Confirma tu nueva cuenta

      ¡Bienvenido a Demo!

      Haz clic en el siguiente enlace para confirmar y activar tu nueva cuenta:
      https://example.discourse.site/u/activate-account/74d53d7d2cf20dsbc360614844c653s2

      Si el enlace anterior no es clicable, intenta copiarlo y pegarlo en la barra de direcciones de tu navegador web.

      Al seguir el enlace, se navega por algunas de las páginas para activar una nueva cuenta. Al final, el usuario inicia sesión correctamente. Desde este punto, el usuario puede iniciar sesión con su nombre de usuario o con la dirección de correo ANTIGUA. La nueva dirección de correo no parece estar activa en este momento.

      Opción 2: Al hacer clic en el botón “Cambiar dirección de correo electrónico”, se muestra lo siguiente. El botón “Actualizar dirección de correo electrónico” está deshabilitado cuando la nueva dirección de correo está en el campo de texto, sugiriendo que la nueva dirección ya está activa (pero eso no parece ser cierto).

    • El usuario inicia un restablecimiento de contraseña. El correo electrónico se envía a la dirección de correo nueva y el usuario puede iniciar sesión con el enlace. Al igual que en los otros escenarios, el usuario puede iniciar sesión con su nombre de usuario o con la dirección de correo ANTIGUA. La nueva dirección de correo no parece estar activa en este momento.

Así que definitivamente estamos reproduciendo estos problemas. Es algo complicado de explicar claramente, pero espero que entre el mensaje original y este resumen, tenga sentido. Ciertamente, parece haber varios aspectos que necesitan corrección.

@martin, sé que has trabajado en esta parte del núcleo en el pasado. ¿Podrías opinar aquí cuando tengas un momento?

9 Me gusta

¿Por qué habría retrocedido esto? :thinking:

edición: También puedo confirmar que ha retrocedido. Al editar el correo electrónico de un usuario regular, la confirmación y demás se envían al correo ANTERIOR. Eso no es como funcionaba antes..

4 Me gusta

Esa sensación de familiaridad incómoda cuando estás leyendo la descripción del pull request citado y te das cuenta de que tú eres el culpable…

Gracias por las instrucciones detalladas @tshenry y @RGJ. Pondré esto en la parte superior de mi lista para arreglarlo esta semana.

4 Me gusta

De acuerdo, ya tengo claro el asunto y revisé el tema antiguo sobre comentarios eliminados para consultar el historial. Encontré esto de @sam, que ahora recuerdo:

El caso en que el administrador restablece el correo electrónico es muy diferente; en realidad se trata de que el administrador restablece el correo electrónico y la contraseña. Porque si el usuario tuviera acceso a la cuenta, podría hacerlo todo mediante el autoservicio.

Así que estamos diciendo que, como es el administrador quien cambia el correo electrónico, debería enviarse un correo de restablecimiento de contraseña, porque si el usuario tuviera acceso al correo antiguo, simplemente podría… iniciar sesión y hacerlo por sí mismo. ¿Pero el correo de restablecimiento de contraseña también actúa como una confirmación? Sin completar el proceso de restablecimiento de contraseña (que actualmente es imposible porque se envía al correo antiguo), el nuevo correo no se considera “confirmado”, y es eso lo que hace que aparezca este modal:

El problema de que el correo de restablecimiento de contraseña se envíe a la dirección antigua se soluciona fácilmente, y al menos llegaremos a un estado en el que se pueda seguir el proceso de restablecimiento:

Además, dado que actualmente el correo de restablecimiento de contraseña se envía al correo antiguo, al confirmarlo se valida la dirección incorrecta y se vuelve a establecer el correo del usuario al antiguo.

Voy a modificar los mensajes dirigidos al administrador que cambia el correo electrónico para dejarle claro que el usuario debe hacer clic en el enlace del nuevo correo y cambiar su contraseña para que el cambio surta pleno efecto (y también para solucionar el problema del correo incorrecto).

4 Me gusta

Espera. No entiendo esto.

Existe una diferencia entre que un usuario pueda acceder al correo electrónico antiguo y que un usuario necesite restablecer la contraseña de su cuenta de Discourse. Lo primero no implica en absoluto lo segundo; son situaciones totalmente distintas.

Una gran cantidad de cambios de correo realizados por el administrador también se deben a que el usuario no sabe cómo hacerlo, o porque el administrador necesita levantar temporalmente la restricción email_editable = false.

Me resulta muy confuso que un restablecimiento de contraseña sirva también como confirmación de correo. Personalmente, ni siquiera respondería al correo de restablecimiento de contraseña; no lo solicité y no me daría cuenta de que era un paso de confirmación necesario (y creo que no lo es; ¿no bastaría con un correo de confirmación habitual?)

4 Me gusta

Podría estar relacionado:

Cuando uno de mis usuarios del foro intenta restablecer su contraseña hoy (ejecutando la última versión de Discourse a partir de esta mañana), recibe el correo electrónico, pero luego aparece un error al hacer clic en el enlace del correo:

Obtiene este error en varios navegadores y no está usando un bloqueador de anuncios.

Cuando voy a la página de Preferencias de su cuenta y hago clic en “Enviar correo de restablecimiento de contraseña”, también aparece un mensaje de error:

Antes de mostrar “(error)” junto al botón, parpadea brevemente “(enviando correo)”. Parece que no se envió ningún correo, aunque. Puedo verificar que otros correos del foro se están enviando con normalidad hoy.

Esta función funcionaba correctamente antes… parece haber dejado de funcionar en algún momento durante la última semana.

Revisa los registros de errores de Discourse en el navegador web cuando hayas iniciado sesión como administrador; debería haber un informe de error allí con más detalles.

Aquí está la entrada del error:

398 Excepción de trabajo: El origen de copia especificado es más grande que el tamaño máximo permitido para un origen de copia: 5368709120

aws-sdk-core-3.99.1/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call'

aws-sdk-s3-1.66.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:22:in `call'

aws-sdk-s3-1.66.0/lib/aws-sdk-s3/plugins/dualstack.rb:26:in `call'

aws-sdk-s3-1.66.0/lib/aws-sdk-s3/plugins/accelerate.rb:35:in `call'

aws-sdk-core-3.99.1/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:20:in `call'

aws-sdk-core-3.99.1/lib/aws-sdk-core/plugins/idempotency_token.rb:17:in `call'

aws-sdk-core-3.99.1/lib/aws-sdk-core/plugins/param_converter.rb:24:in `call'

aws-sdk-core-3.99.1/lib/aws-sdk-core/plugins/response_paging.rb:10:in `call'

aws-sdk-core-3.99.1/lib/seahorse/client/plugins/response_target.rb:23:in `call'

aws-sdk-core-3.99.1/lib/seahorse/client/request.rb:70:in `send_request'

aws-sdk-s3-1.66.0/lib/aws-sdk-s3/client.rb:1108:in `copy_object'

/var/www/discourse/lib/backup_restore/s3_backup_store.rb:61:in `block in vacate_legacy_prefix'

/var/www/discourse/lib/backup_restore/s3_backup_store.rb:60:in `each'

/var/www/discourse/lib/backup_restore/s3_backup_store.rb:60:in `vacate_legacy_prefix'

/var/www/discourse/app/jobs/onceoff/vacate_legacy_prefix_backups.rb:7:in `execute_onceoff'

/var/www/discourse/app/jobs/onceoff/onceoff.rb:25:in `execute'

/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'

rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'

/var/www/discourse/app/jobs/base.rb:221:in `block in perform'

/var/www/discourse/app/jobs/base.rb:217:in `each'

/var/www/discourse/app/jobs/base.rb:217:in `perform'

sidekiq-6.1.2/lib/sidekiq/processor.rb:196:in `execute_job'

sidekiq-6.1.2/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'

sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'

/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call'

sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'

sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:143:in `invoke'

sidekiq-6.1.2/lib/sidekiq/processor.rb:163:in `block in process'

sidekiq-6.1.2/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/job_retry.rb:111:in `local'

sidekiq-6.1.2/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq.rb:38:in `block in <module:Sidekiq>'

sidekiq-6.1.2/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/processor.rb:257:in `stats'

sidekiq-6.1.2/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/job_logger.rb:13:in `call'

sidekiq-6.1.2/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/job_retry.rb:78:in `global'

sidekiq-6.1.2/lib/sidekiq/processor.rb:124:in `block in dispatch'

sidekiq-6.1.2/lib/sidekiq/logger.rb:10:in `with'

sidekiq-6.1.2/lib/sidekiq/job_logger.rb:33:in `prepare'

sidekiq-6.1.2/lib/sidekiq/processor.rb:123:in `dispatch'

sidekiq-6.1.2/lib/sidekiq/processor.rb:162:in `process'

sidekiq-6.1.2/lib/sidekiq/processor.rb:78:in `process_one'

sidekiq-6.1.2/lib/sidekiq/processor.rb:68:in `run'

sidekiq-6.1.2/lib/sidekiq/util.rb:15:in `watchdog'

sidekiq-6.1.2/lib/sidekiq/util.rb:24:in `block in safe_thread'
1 me gusta

No, eso es absolutamente sin relación. Intenta limpiar los registros y forzar que ocurra este error, luego revisa los registros nuevamente.

Entonces los registros permanecen en blanco después de que ocurre el error.

Entiendo tu punto de vista; para mí, la idea de usar el restablecimiento de contraseña como confirmación me confundió ayer. Creo que esto podría ser una opción secundaria para el administrador al cambiar el correo electrónico de un usuario, marcando una casilla que diga “Restablecer también la contraseña del usuario”. Voy a fusionar la PR que tengo para una corrección tal cual está, porque el proceso está totalmente roto en este momento.

Me gustaría que @sam opinara sobre un nuevo proceso/flujo, ya que Sam habló originalmente sobre la razón detrás del flujo de restablecimiento de contraseña:

  1. El administrador cambia el correo electrónico del usuario. Tiene la opción de restablecer su contraseña al mismo tiempo.
  2. El usuario recibe un correo electrónico en su nueva dirección solicitando confirmación para cambiar su correo electrónico.
    • Si dice Sí, se cambia el correo electrónico. Enviamos un correo electrónico a su dirección antigua indicando que el correo electrónico ha sido cambiado.
    • Si dice No, no se hace nada.
  3. Si el administrador especificó que quería un restablecimiento en el paso 1., en cuanto el usuario confirma el cambio de su correo electrónico, recibe un correo de restablecimiento de contraseña en la nueva dirección.

Creo que esto sería mucho más claro, y el restablecimiento de contraseña no tendría nada que ver con confirmar el cambio de correo electrónico.

2 Me gusta

Sí, no veo por qué estas dos cosas estarían relacionadas en absoluto.

1 me gusta

Veo un buen nuevo commit fusionado del que la gente estará contenta :smiley:

3 Me gusta

Gracias, esto solo fusionará una corrección para el estado “completamente roto”. ¡Otra PR seguirá!

Se hizo de esta manera a partir de las discusiones en el tema anterior con Sam. Procederé con el nuevo proceso para levantar el velo de confusión y eliminar el vínculo entre cosas no relacionadas.

4 Me gusta

Acabo de fusionar esta PR que realiza lo siguiente:

  • Modifica el flujo de cambio de correo electrónico en el panel de administración para que el usuario reciba un correo electrónico de confirmación del cambio.
  • Ahora registramos quién solicitó el cambio de correo electrónico.
  • Si el solicitante es un administrador y no el usuario, lo indicamos en el correo electrónico enviado al usuario.
  • También hacemos que la ruta de confirmación del cambio de correo electrónico esté abierta a usuarios anónimos, para que el usuario pueda hacer clic en ella incluso si no tiene acceso a su cuenta. Si hay un usuario conectado, nos aseguramos de que la confirmación coincida con el usuario actual.

¡Esperamos que esto haga que el proceso sea mucho más claro!

4 Me gusta