como eu disse acima:
e aqui você postou:
o que você sabe sobre o MiniOrange? o plano gratuito parece ser limitado a apenas alguns usuários, e assim pode ficar caro para você a $49/mês para o plano básico:
pesquisa e leitura cuidadosa são essenciais ao planejar o que você deseja alcançar.
você sabe como escrever um script Velo para o Wix?
talvez uma solução em JavaScript
eu acho que você precisará configurar um endpoint de API personalizado diretamente no seu site Wix para receber as solicitações de login do Discourse. parece que isso exigirá código JavaScript em um módulo Velo com um arquivo chamado http-functions.js.
isso interceptará o usuário do Discourse, redirecionará e verificará sua sessão de login no Wix, gerará uma carga útil assinada e, esperançosamente, os enviará de volta com segurança ao fórum.
algo como isso talvez:
import { ok, redirect, badRequest } from 'wix-http-functions';
import { currentMember } from 'wix-members-backend';
import crypto from 'crypto';
// escolha uma string aleatória segura para o segredo
const DISCOURSE_SECRET = "YOUR_SUPER_SECRET_STRING_HERE";
export async function get_discourseSso(request) {
const query = request.query;
const payload = query.sso;
const sig = query.sig;
if (!payload || !sig) {
return badRequest({ body: "Parâmetros SSO ausentes" });
}
// valide a assinatura recebida do Discourse
const computedSig = crypto.createHmac('sha256', DISCOURSE_SECRET).update(payload).digest('hex');
if (computedSig !== sig) {
return badRequest({ body: "Assinatura criptográfica inválida" });
}
// verifique se o usuário está logado no Wix
const member = await currentMember.getMember({ fieldsets: ['FULL'] });
// analise a carga útil recebida para recuperar o nonce de rastreamento exclusivo
const decodedPayload = Buffer.from(payload, 'base64').toString('ascii');
const params = new URLSearchParams(decodedPayload);
const nonce = params.get('nonce');
if (!member) {
// Se não estiver logado, force-o a fazer login no Wix primeiro, depois retorne aqui
const loginUrl = `https://yourwixsite.com{encodeURIComponent(request.url)}`;
return redirect(loginUrl);
}
// construa a carga útil do usuário para o 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)}`;
// criptografe e assine a carga útil do usuário
const base64Payload = Buffer.from(userPayload).toString('base64');
const returnSig = crypto.createHmac('sha256', DISCOURSE_SECRET).update(base64Payload).digest('hex');
// redirecione-os de volta ao Discourse como um usuário logado
const discourseReturnUrl = `https://yourforum.com{encodeURIComponent(base64Payload)}&sig=${returnSig}`;
return redirect(discourseReturnUrl);
}
você também precisará substituir a URL do seu fórum lá
também haverá alguma configuração do DiscourseConnect, mas não faça nenhuma dessas coisas até que você tenha um fórum auto-hospedado funcionando sem erros.
eu não sou especialista em nenhuma dessas coisas e mal sei algo sobre o Wix, então não há garantias de que essa seja a solução funcional. eu só estou dando um exemplo de um método proposto para demonstrar a complexidade.