在自托管 VPS 上安装 Discourse:附常见问题解答

正如我上面所说:

而在这里你发布了:

你对 MiniOrange 了解多少?免费计划似乎仅限少数用户使用,因此如果你使用每月 49 美元的基础计划,费用可能会变得很高:

在规划想要实现的目标时,研究和仔细阅读至关重要。

你会编写 Wix 的 Velo 脚本吗?

也许是一个 JavaScript 解决方案

我认为你需要直接在 Wix 网站上设置一个自定义 API 端点,以接收来自 Discourse 的登录请求。看起来这需要在名为 http-functions.js 的文件中编写 Velo 模块的 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 也知之甚少,所以不能保证这是可行的解决方案。我只是提供一个拟议方法的示例,以说明其复杂性。