VPSにDiscourseをインストールする:よくある質問付きプロセス

上で述べた通りです:

そしてここで投稿しました:

MiniOrangeについてご存知ですか? フリープランはユーザー数が非常に限られているように見えますし、そのためベーシックプラン(月額49ドル)になるとあなたにとって高価になる可能性があります:

達成したい目標を計画する際には、調査と慎重な読み込みが不可欠です。

WixのVeloスクリプトの書き方はご存知ですか?

おそらくJavaScriptのソリューション

Discourseからのログイン要求を受け取るために、Wixのサイト上に直接カスタムAPIエンドポイントをセットアップする必要があると思います。Veloモジュールの http-functions.js というファイルにJavaScriptコードが必要そうです。

これにより、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: "Missing SSO parameters" });
    }

    // Discourseからの受信署名を検証

    const computedSig = crypto.createHmac('sha256', DISCOURSE_SECRET).update(payload).digest('hex');
    if (computedSig !== sig) {
        return badRequest({ body: "Invalid cryptographic signature" });
    }

    // ユーザーが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の構成も必要になりますが、エラーなく実際に動作するセルフホスト型のフォーラムが立ち上がるまでは、これらの作業を行わないでください。

私はこれらの分野の専門家ではなく、Wixについてもほとんど知識がないため、これが動作するソリューションであるという保証はありません。単に複雑さを示すために、提案された方法の例を提示しているだけです。