Tengo un foro de Discourse funcionando, donde los usuarios pueden crear un inicio de sesión local (nombre de usuario + contraseña).
Me gustaría reutilizar su nombre de usuario y contraseña en otra aplicación. En otras palabras: los usuarios introducirían su nombre de usuario y contraseña en la otra aplicación, y la aplicación debería poder comprobar si se trata de un inicio de sesión válido para el foro.
He estado leyendo la documentación de la API de Discourse. Muchas cosas son posibles, incluido el establecimiento del nombre de usuario y la contraseña para un usuario determinado, pero no encontré un punto final de API para validar un nombre de usuario y contraseña existentes contra la lista de usuarios del foro.
Supongo que debe existir un punto final de API de este tipo, ya que el foro debe poder hacerlo para iniciar sesión de un usuario a través de la interfaz web.
¿Cuál es el punto final de la API para comprobar un nombre de usuario y una contraseña para iniciar sesión en el foro?
Estos son métodos sugeridos para autenticar usuarios en lugar de manejar credenciales de inicio de sesión directamente. También significa que no necesita intentar manejar los detalles de 2FA.
En realidad, mi “otra aplicación” es una aplicación de escritorio, no una aplicación web. No creo que discourse-auth-proxy funcione en ese caso.
En la página de DiscourseConnect, una de las primeras afirmaciones es esta:
Muchos sitios que desean integrarse con un sitio de Discourse quieren mantener todo el registro de usuarios en un sitio separado. En tal configuración, todas las operaciones de inicio de sesión deben ser externalizadas a ese sitio diferente.
Esto es exactamente lo contrario de lo que quiero hacer: quiero externalizar todas las operaciones de inicio de sesión a Discourse. ¿Hay alguna forma de usar DiscourseConnect para hacer eso?
Lo complicado es que hay un secreto compartido entre el proveedor (Discourse) y el consumidor (tu aplicación). Si distribuyes tu aplicación, los usuarios tendrán acceso a todos los secretos en ella.
Poner un proxy de autenticación delante de un servicio web mínimo personalizado que proporcione un token firmado a tu aplicación podría funcionar bien.
Estoy seguro de que hay otras formas de hacerlo en las que no estoy pensando.
¿Te refieres a la clave API? Parece posible crear una clave API “granular”, que solo tenga acceso a puntos finales de API específicos. Todavía no me queda claro qué puntos finales se requerirían si utilizo ese enfoque. ¿Lo sabes?
Sí, un servicio web mínimo con un proxy de autenticación podría ser una buena solución; tendré que experimentar un poco para averiguarlo.
No exactamente: sería el valor de discourse connect provider secrets para la aplicación, que debería configurarse junto con enable discourse connect provider.
Si entiendo esto correctamente, este método significaría que el usuario inicia sesión usando un navegador. Eso puede funcionar, aunque esperaba encontrar un método donde el nombre de usuario y la contraseña se puedan ingresar en nuestra aplicación de escritorio, sin abrir un navegador.
Entiendo que el enfoque que tengo en mente no admitirá TFA a menos que lo implemente yo mismo, y que no admitirá inicios de sesión a través de proveedores externos (Google, Facebook, Discord, …)
Según entiendo en este momento, parece que el método utilizado en el ejemplo de Reactive Native se puede transponer a nuestra aplicación de escritorio (que está en Python).
El punto de acceso a la API utilizado parece ser <site>/session, y toma un nombre de usuario, una contraseña y un token csrf. El token csrf se puede obtener de <site>/session/csrf.
Esto está muy cerca de lo que estaba buscando. Creo que lo intentaré y volveré a informar si me funciona.
¿Está documentado en algún lugar el punto de acceso a la API <site>/session?
La mejor manera de conseguir lo que quieres en una aplicación de escritorio es usar las Claves de API de Usuario.
Necesitas una interfaz web, ya sea en la aplicación o abriendo el navegador, pero si haces que tu aplicación sea un manejador del protocolo utilizado por las aplicaciones móviles, puedes hacer que obtenga fácilmente el token de esa manera y solo tengas que usar el navegador de nuevo si el token expira o si usan un dispositivo diferente.
Mi experiencia personal con esto es que usar las claves de API de usuario es una opción mucho más segura y sencilla que intentar usar los puntos finales de sesión.
Aquí hay 20 líneas de código Python que hacen aproximadamente lo mismo que el código de React Native al que se refiere @renato (excepto que no hay compatibilidad con Discourse 2.5; no lo necesito).
Funciona bien, asumiendo que estás utilizando el inicio de sesión básico basado en nombre de usuario y contraseña. Aún así, investigaré los métodos alternativos, utilizando el inicio de sesión SSO de Discourse según lo configurado en la instancia de Discourse.
He intentado aplicar esto pero no consigo que funcione. A continuación, se muestra un código Python (simplificado) que genera una URL para .../session/sso_provider. Cuando lo intento, obtengo Login Error. No tengo idea de qué significa eso.
Como administrador, habilita verbose discourse connect logging, pruébalo y luego revisa /logs en tu foro para ver errores más detallados, por ejemplo: https://forum.embeetle.com/logs
Por cierto, necesitas revocar y cambiar este secreto inmediatamente porque cualquiera que lo tenga puede iniciar sesión en tu aplicación, como acabo de hacer mientras probaba esto.