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.