¿Es posible enviar un enlace de inicio de sesión por correo electrónico a través de la API?

¡Hola! Me encanta usar la API de Discourse.

Siguiendo la guía sobre ingeniería inversa de la API, me he encontrado con un problema al intentar que la API envíe un enlace de inicio de sesión.

Contexto de por qué estoy haciendo esto
He creado un servicio de SSO para un hackerspace local para que los usuarios puedan iniciar sesión en nuestro Discourse con el sistema de membresía del hackerspace.

Sin embargo, algunas personas pueden haber utilizado una dirección de correo electrónico diferente en el sistema de membresía que en Discourse. Como el inicio de sesión local está deshabilitado cuando SSO está activado, me gustaría que las personas pudieran hacer clic en «Enviarme un enlace de inicio de sesión» para que puedan iniciar sesión y luego actualizar su dirección de correo electrónico si lo desean (o seguir usando el enlace de inicio de sesión, lo que prefieran).

Objetivo
Me gustaría enviar un enlace de inicio de sesión al usuario @ domain .co.uk a través de la API.

He intentado lo siguiente:

curl -X POST "https://discourse.<site>.org.uk/u/email-login" --data "{\"login\":\"user\"%\"40domain.co.uk\"}" -H "Api-Key: xxxxx" -H "Api-Username: system" -H "Content-Type: application/json"

Lo que obtengo como respuesta es:

<html><body>Estás siendo <a href="https://discourse.<site>.org.uk/">redirigido</a>.</body></html>

Si no incluyo la clave de API, obtengo [BAD CSRF] como respuesta.

Así que en lo que estoy atascado es: ¿cómo puedo hacer que Discourse envíe un enlace de inicio de sesión por correo electrónico al usuario @ domain .co.uk a través de la API?

Muchas gracias por cualquier ayuda. Seguiré probando cosas para ver qué funciona.


P.D. Me gustaría no tener que usar un truco como:
Hacer una solicitud a /session/csrf y guardar el token CSRF.
Luego hacer una solicitud a /u/email-login con el token CSRF.

¿Es posible hacer esto solo con una clave de API?

¡Gracias!
:slight_smile:

Solo para hacer seguimiento, ¿es la forma correcta de hacerlo usar la ruta CSRF seguida de la ruta del enlace por correo electrónico?

¿No existe ninguna implementación de esto en la API cuando se proporciona una clave de API?

¿Cómo se integra tu servicio de SSO con Discourse? Si estás utilizando DiscourseConnect, creo que el endpoint /u/email-login estará deshabilitado.

Gracias por tu respuesta. Y sí, está usando Discourse Connect.

Ves, yo también pensé eso, así que desactivé Discourse Connect e intenté obtener un enlace de inicio de sesión, pero no pude hacerlo funcionar y así es como obtuve el resultado en mi publicación anterior.

Si obtener un enlace por correo electrónico está deshabilitado cuando Discourse Connect está activado, entonces tendré que replantear mi enfoque para vincular las cuentas del servicio SSO del sistema de membresía con Discourse.

La forma más sencilla, como mencionaste, es emparejar las cuentas por dirección de correo electrónico. Cuando eso no es posible, hay un par de enfoques que utilizamos:

  1. Emparejar usuarios utilizando algún otro identificador único. Puedes precrear asociaciones de DiscourseConnect para un usuario a través de la consola. Esto solo funcionará si tienes algún otro identificador que sea consistente entre Discourse y el proveedor de identidad.

  2. (lo más común) permitir que los usuarios se registren para crear nuevas cuentas, luego pedirles que envíen un mensaje a un administrador y soliciten que la nueva cuenta se “fusioné” con la antigua (usando el botón en la parte inferior de la página de administración de usuarios). Esto emparejará automáticamente los correos electrónicos y creará la asociación de DiscourseConnect.

Gracias por tu respuesta.

La opción de fusionar cuentas es probablemente la que elegiré.

Sería excelente que este proceso fuera autogestionable, quizás mediante una API donde los usuarios puedan iniciar sesión a través de un enlace por correo electrónico y luego actualizar su dirección de correo para sincronizar ambas cuentas.
O bien, permitiendo que un usuario se autentique proporcionando su correo electrónico y contraseña de Discourse, junto con una nueva dirección de correo electrónico.

Gracias nuevamente por tu tiempo.