Desactivar el requisito de correo electrónico de activación para usuarios invitados

Hola a todos, tengo un caso de uso que actualmente no está muy bien soportado: necesito desactivar el correo de activación para los usuarios invitados, incluidos los usuarios invitados mediante un enlace.

Después de crear el tema mencionado anteriormente, esto fue implementado, pero solo para usuarios invitados por correo electrónico.

Mi instancia de Discourse es solo por invitación y, de hecho, estoy enviando enlaces de invitación por correo electrónico, pero no los correos electrónicos integrados de Discourse. Genero los enlaces de invitación con una solicitud POST a /invites/link y los almaceno en una base de datos externa; desde allí, envío los enlaces al usuario. Así que cuando los usuarios hacen clic en el enlace, ya han verificado su correo electrónico, pero luego se les pide que lo hagan una vez más.

Sé que mi caso de uso no es particularmente común, así que pensé que probaría crear un plugin sencillo para modificar las partes necesarias de Discourse y hacer que funcione como lo necesito.

Ya tengo un esqueleto funcionando y he añadido una configuración del sitio (no_activation_enabled). Tras buscar en el repositorio principal, creo que este podría ser el archivo que necesita edición:

No estoy completamente seguro, pero creo que quizás cambiando condicionalmente (si SiteSetting.no_activation_enabled es verdadero y si el usuario fue invitado por un miembro del personal, tal vez invite.invited_by.staff?) el valor de active a true en user.attributes podría funcionar:

    user.attributes = {
      email: invite.email,
      username: available_username,
      name: name || available_username,
      active: false,
      trust_level: SiteSetting.default_invitee_trust_level,
      ip_address: ip_address,
      registration_ip_address: ip_address
    }

Pero, ¿cómo puedo hacer este cambio desde un plugin? ¿Acaso eso está dentro del alcance de lo que pueden hacer los plugins? ¿O solo pueden añadir cosas, no modificarlas? ¿O necesito reemplazar todo el archivo invite_redeemer.rb?

He completado la introducción a la creación de plugins, así como esta guía, pero después de horas tratando de investigar el código, incluyendo otros plugins, siento que estoy dando cabezazos contra la pared… Así que, si alguien tiene algún consejo para mí, ¡estaría muy agradecido!

Si estás gestionando esto desde un sitio externo, ¿por qué no delegar el SSO y simplemente transmitir la verificación en el payload?

Hola Stephen, gracias por tu aporte.

No gestiono cuentas de usuarios en un sitio externo. Tengo un Airtable maestro con Zapier y GCFs que conectan varios servicios (ESP, etc.), pero Discourse es la base de datos principal de usuarios. Simplemente no quiero usar el formulario de registro estándar de Discourse, ya que no es ideal para la conversión y no se puede integrar, por ejemplo, en publicaciones de blog. De hecho, Discourse actúa como proveedor de SSO para el sitio de contenido basado en Jekyll, ya que envía solicitudes fetch para verificar si un usuario ha iniciado sesión en Discourse y ajusta las páginas de contenido en consecuencia.

¡Hola, bienvenido! :slight_smile:

Al igual que @Stephen, no estoy completamente seguro de que esta sea la herramienta adecuada, pero confío en que lo has pensado lo suficiente.

Evitaría esto a toda costa. Casi siempre hay otra solución, incluso si tienes que hacer un monkey patch a una clase. Sobre los monkey patches en Discourse, consulta: Override existing Discourse methods in plugins.

En este caso, parece que ya hay código en el método en el que te estás centrando que hace lo que buscas: discourse/app/models/invite_redeemer.rb at main · discourse/discourse · GitHub

El problema es que las invitaciones que has generado no tienen el emailed_status_type correcto, por lo que esa condición no se cumple. Creo que la solución aquí es generar invitaciones diferentes desde el principio. Ahí es donde me centraría.

Esto reintroduce esencialmente una función que fue eliminada del núcleo porque era demasiado peligrosa: si alguna vez manejas mal estos tokens de invitación, quien los robe (antes de que el destinatario previsto los utilice) podría iniciar sesión en el foro como el destinatario. Te sugiero encarecidamente no usar este tipo de invitación para ninguna cuenta de moderador o administrador.

Por eso el código para manejar esto ya está ahí, pero necesitarás hacer algunos ajustes personalizados para poder acceder realmente a él.