Установка Discourse на выделенном VPS. Процесс с FAQ

Как я уже сказал выше:

а здесь вы написали:

Что вы знаете о MiniOrange? Бесплатный план, похоже, ограничен лишь несколькими пользователями, поэтому он может оказаться для вас дорогим — $49 в месяц за базовый план:

Исследование и внимательное чтение документации имеют решающее значение при планировании того, чего вы хотите достичь.

Вы умеете писать скрипты Velo для Wix?

возможно, решение на JavaScript

Думаю, вам потребуется настроить собственный конечный пункт API (endpoint) непосредственно на вашем сайте Wix для получения запросов на вход от Discourse. Похоже, что это потребует JavaScript-кода в модуле Velo в файле с именем http-functions.js.

Этот код будет перехватывать пользователя из Discourse, перенаправлять и проверять его активную сессию входа в Wix, генерировать подписанный пакет данных и, надеюсь, безопасно возвращать его на форум.

Что-то вроде этого, возможно:

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

// выберите безопасную случайную строку в качестве секрета 

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: "Отсутствуют параметры SSO" });
    }

    // проверяем входящую подпись от Discourse

    const computedSig = crypto.createHmac('sha256', DISCOURSE_SECRET).update(payload).digest('hex');
    if (computedSig !== sig) {
        return badRequest({ body: "Неверная криптографическая подпись" });
    }

    // проверяем, вошел ли пользователь в Wix

    const member = await currentMember.getMember({ fieldsets: ['FULL'] });
    
    // разбираем входящий пакет данных, чтобы получить уникальный трекер nonce

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

    if (!member) {
        // Если не вошел, заставляем его сначала войти в Wix, а затем вернуться сюда
        const loginUrl = `https://yourwixsite.com{encodeURIComponent(request.url)}`;
        return redirect(loginUrl);
    }

    // формируем пакет данных пользователя для 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)}`;

    // шифруем и подписываем пакет данных пользователя
    const base64Payload = Buffer.from(userPayload).toString('base64');
    const returnSig = crypto.createHmac('sha256', DISCOURSE_SECRET).update(base64Payload).digest('hex');

    // перенаправляем его обратно в Discourse как вошедшего пользователя
    const discourseReturnUrl = `https://yourforum.com{encodeURIComponent(base64Payload)}&sig=${returnSig}`;
    return redirect(discourseReturnUrl);
}

Вам также нужно будет заменить там URL вашего форума.

Также потребуется некоторая конфигурация DiscourseConnect, но не делайте ничего из этого, пока у вас не будет запущенного и работающего без ошибок собственного self-hosted форума.

Я не эксперт в этих вещах и почти ничего не знаю о Wix, поэтому никаких гарантий, что это рабочее решение. Я просто привожу пример предложенного метода, чтобы продемонстрировать сложность задачи.