Entonces, ¿quieres usar Discourse como proveedor de identidad para tu propia aplicación web? ¡Genial! Empecemos.
Habilitar la configuración del proveedor DiscourseConnect
En la configuración de administración del sitio de Discourse (/admin/site_settings), habilita la configuración enable discourse connect provider y agrega una cadena secreta a discourse connect provider secrets (utilizada para hashear las cargas útiles de SSO).
Implementar DiscourseConnect en tu aplicación web:
-
Genera un nonce aleatorio. Llamemos a este valor
NONCE. Guárdalo temporalmente para poder verificarlo con el valor nonce que se devolverá en la respuesta. -
Crea una nueva carga útil con el
NONCEy unaRETURN_URL(a donde Discourse redirigirá al usuario después de la verificación). La carga útil debe verse así:nonce=NONCE\u0026return_sso_url=RETURN_URL. El host deRETURN_URLdebe coincidir con el patrón de dominio que usaste al configurardiscourse connect provider secrets. -
Codifica en Base64 la carga útil sin procesar anterior. Llamemos a esta carga útil
BASE64_PAYLOAD. -
Codifica en URL la
BASE64_PAYLOADanterior. Llamemos a esta carga útilURL_ENCODED_PAYLOAD. -
Genera una firma HMAC-SHA256 a partir de
BASE64_PAYLOADusando tu secreto de proveedor sso como clave, luego crea una cadena hexadecimal en minúsculas a partir de esto. Llamemos a esta firmaHEX_SIGNATURE.
Enviar solicitud de autenticación a Discourse
Redirige al usuario a DISCOURSE_ROOT_URL/session/sso_provider?sso=URL_ENCODED_PAYLOAD\u0026sig=HEX_SIGNATURE
Recibir respuesta de Discourse:
Si los pasos anteriores se realizaron correctamente, Discourse redirigirá al usuario que ha iniciado sesión a la RETURN_URL proporcionada. Recibirás parámetros de cadena de consulta con sig y sso junto con algo de información del usuario. Ahora sigue los siguientes pasos:
-
Calcula el HMAC-SHA256 de
ssousando el secreto del proveedor sso como tu clave. -
Convierte
sigde su representación de cadena hexadecimal de vuelta a bytes. -
Asegúrate de que los dos valores anteriores sean iguales.
-
Decodifica en Base64
sso; obtendrás la cadena de consulta incrustada pasada. Esto tendrá una clave llamadanoncecuyo valor debe coincidir con el nonce pasado originalmente. Asegúrate de que este sea el caso y asegúrate de eliminar el nonce de tu sistema. -
Descubrirás que esta cadena de consulta también contiene mucha información del usuario. Úsala como mejor te parezca.
Eso es todo. ¡A estas alturas deberías haber configurado tu aplicación web para usar Discourse como proveedor SSO!
Más Parámetros, Más Opciones
Además de nonce y return_sso_url, la carga útil de la solicitud tiene varios parámetros opcionales adicionales.
-
prompt: Siprompt=none, entonces la solicitud SSO se trata como una solicitud de “solo verificación”. Si el navegador/dispositivo ya ha iniciado sesión en Discourse, Discourse devolverá una respuesta SSO exitosa con información de autenticación del usuario, como de costumbre. Si el navegador/dispositivo no ha iniciado sesión, entonces Discourse no le pedirá al usuario que inicie sesión, y devolverá inmediatamente una respuesta SSO con el parámetrofailed=trueen lugar de la información del usuario. Esto proporciona un mecanismo para consultar si el usuario ha iniciado sesión, sin dirigir nunca al usuario a un diálogo de inicio de sesión si no lo está. -
logout: Silogout=true, entonces la solicitud SSO se convierte en una solicitud de cierre de sesión. Si un usuario ha iniciado sesión en Discourse en ese navegador/dispositivo, se cerrará la sesión en ese dispositivo. En cualquier caso, Discourse redirigirá inmediatamente a lareturn_sso_url, sinssoosigagregados a la cadena de consulta. -
require_2fa: Sirequire_2fa=true, entonces Discourse requerirá que el usuario verifique la autenticación de dos factores antes de ser redirigido de vuelta. La carga útil de respuesta incluiráconfirmed_2fa=truesi el usuario completó con éxito la verificación 2FA, ono_2fa_methods=truesi el usuario no tiene métodos 2FA configurados.
prompt=none y logout=true son mutuamente excluyentes; no tiene sentido proporcionar ambos en la misma solicitud.
Referencia de carga útil sso=
Parámetros de solicitud:
nonce: (string, requerido) una cadena aleatoria generada de forma segurareturn_sso_url: (string, requerido) la URL a la que redirigir con la respuestaprompt: (string, opcional) Si esnone, sonda el estado de autenticación sin solicitar al usuario que inicie sesión.logout: (boolean, predeterminadofalse) Si estrue, cierra la sesión del usuario en Discourse.require_2fa: (boolean, predeterminadofalse) Si estrue, requiere que el usuario verifique la autenticación de dos factores antes de redirigir de vuelta.
Parámetros de resultado:
-
No hay carga útil
sso=ni firma en respuesta a una solicitud de cierre de sesión, solo una redirección a lareturn_sso_urlsimple de la solicitud. -
La carga útil de resultado para una solicitud de inicio de sesión siempre contendrá el
nonce, reflejado desde la solicitud. -
La carga útil de resultado también reflejará cualquier otro parámetro de solicitud. No confíes en este comportamiento; no es necesariamente intencional y no es un aspecto garantizado de la API. (Por ejemplo, ¿por qué el parámetro
return_sso_urlse copia en la carga útil que se envía a lareturn_sso_url?) -
Si la solicitud falló al autenticar a un usuario, la carga útil de resultado contendrá
failed=true. -
Si la solicitud logró autenticar a un usuario, la carga útil de resultado contendrá credenciales/información del usuario:
external_id: (string) ID de usuario de Discourseusername: (string) nombre de usuario/identificadorname: (string) nombre real del usuarioemail: (string) dirección de correo electrónicoavatar_url: (string) URL CDN completa de la imagen de avatar subida del usuarioadmin: (boolean)truesi el usuario es un administrador, de lo contrariofalsemoderator: (boolean)truesi el usuario es un moderador, de lo contrariofalsegroups: (string) lista separada por comas de grupos (por nombre) a los que pertenece el usuarioprofile_background_url: (string) URL CDN completa de la imagen de fondo del perfil del usuariocard_background_url: (string) URL CDN completa de la imagen de fondo de la tarjeta del usuarioconfirmed_2fa: (boolean)truesi el usuario completó la verificación 2FA (solo presente cuando se solicitórequire_2fa=true)no_2fa_methods: (boolean)truesi el usuario no tiene métodos 2FA configurados (solo presente cuando se solicitórequire_2fa=true)
name,avatar_url,profile_background_urlycard_background_urlpueden estar ausentes si el usuario no ha establecido estos. (Cualquier elemento con un valornildentro de Discourse se omitirá de la respuesta).
Implementaciones oficiales de Discourse de “Uso de Discourse como proveedor de identidad”:
- Un proxy http (usando golang) que utiliza Discourse SSO para autenticar usuarios (solo administradores): GitHub - discourse/discourse-auth-proxy: An http proxy that uses the DiscourseConnect protocol to authenticate users · GitHub (hecho por @sam)
Implementaciones de la comunidad de “Uso de Discourse como proveedor SSO”:
-
Un script PHP que implementa Discourse como proveedor SSO: Discourse sso provider login · GitHub (hecho por @paxmanchris)
-
Erlang:
https://github.com/reverendpaco/discourse-as-sso-erlang -
Node.js:
GitHub - edhemphill/passport-discourse: A Passport strategy for authenticating using a Discourse forum · GitHub
GitHub - ArmedGuy/discourse_sso_node: npm package for Discourse SSO login features. · GitHub -
ASP.NET Core (solo requiere configuración):
GitHub - Biarity/DiscourseSso: Easy, configurable Discourse SSO: GET /auth/login -> recieve a JWT with user data · GitHub -
Extensión MediaWiki (PHP):
DiscourseSsoConsumer, a SSO extension for MediaWiki (hecho por @mdoggydog)
