Instalar Discourse en un VPS autoalojado. Un proceso con preguntas frecuentes

como dije arriba:

y aquí publicaste:

¿Qué sabes sobre MiniOrange? El plan gratuito parece estar limitado a solo unos pocos usuarios, y por lo tanto podría resultar caro para ti a $49/mes por el plan básico:

La investigación y la lectura cuidadosa son esenciales al planificar lo que deseas lograr.

¿Sabes cómo escribir un script de Velo para Wix?

quizás una solución en JavaScript

Creo que necesitarás configurar un punto final de API personalizado directamente en tu sitio de Wix para recibir las solicitudes de inicio de sesión desde Discourse. Parece que requerirá código JavaScript en un módulo de Velo con un archivo llamado http-functions.js.

Esto interceptará al usuario desde Discourse, redirigirá y verificará su sesión iniciada en Wix, generará una carga útil firmada y luego, con suerte, los enviará de vuelta al foro de forma segura.

Algo como esto, quizás:

import { ok, redirect, badRequest } from 'wix-http-functions';
import { currentMember } from 'wix-members-backend';
import crypto from 'crypto';

// elige una cadena aleatoria segura para la clave secreta 

const DISCOURSE_SECRET = "TU_SUPER_CADENA_SECRETA_AQUI"; 

export async function get_discourseSso(request) {
    const query = request.query;
    const payload = query.sso;
    const sig = query.sig;

    if (!payload || !sig) {
        return badRequest({ body: "Faltan parámetros de SSO" });
    }

    // valida la firma entrante de Discourse

    const computedSig = crypto.createHmac('sha256', DISCOURSE_SECRET).update(payload).digest('hex');
    if (computedSig !== sig) {
        return badRequest({ body: "Firma criptográfica inválida" });
    }

    // verifica si el usuario ha iniciado sesión en Wix

    const member = await currentMember.getMember({ fieldsets: ['FULL'] });
    
    // analiza la carga útil entrante para recuperar el nonce de seguimiento único

    const decodedPayload = Buffer.from(payload, 'base64').toString('ascii');
    const params = new URLSearchParams(decodedPayload);
    const nonce = params.get('nonce');

    if (!member) {
        // Si no ha iniciado sesión, fuerza el inicio de sesión en Wix primero, luego regresa aquí
        const loginUrl = `https://tusitowix.com{encodeURIComponent(request.url)}`;
        return redirect(loginUrl);
    }

    // construye la carga útil del usuario para Discourse

    const userPayload = `nonce=${nonce}&email=${encodeURIComponent(member.loginEmail)}&external_id=${member._id}&username=${encodeURIComponent(member.profile.nickname || member._id)}&name=${encodeURIComponent(member.contactDetails.firstName + ' ' + member.contactDetails.lastName)}`;

    // cifra y firma la carga útil del usuario
    const base64Payload = Buffer.from(userPayload).toString('base64');
    const returnSig = crypto.createHmac('sha256', DISCOURSE_SECRET).update(base64Payload).digest('hex');

    // redirige de vuelta a Discourse como usuario iniciado sesión
    const discourseReturnUrl = `https://tuforo.com{encodeURIComponent(base64Payload)}&sig=${returnSig}`;
    return redirect(discourseReturnUrl);
}

también necesitarás reemplazar la URL de tu foro allí

también habrá alguna configuración de DiscourseConnect, pero no hagas nada de esto hasta que tengas un foro autoalojado real en funcionamiento y sin errores.

No soy experto en nada de esto y apenas sé algo sobre Wix, así que no hay garantías de que esta sea la solución funcional. Solo te estoy dando un ejemplo de un método propuesto para demostrar la complejidad.