# 游戏开发 - 用户注册和数据库管理（需要建议)

**URL:** https://meta.discourse.org/t/game-dev-user-registration-db-management-advice-needed/308874
**Category:** SSO
**Created:** [2024年五月21日 13:59 UTC](https://meta.discourse.org/t/game-dev-user-registration-db-management-advice-needed/308874 "2024-05-21T13:59:25Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![aegis.five](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/aegis.five/32/387477_2.png) [@aegis.five](https://meta.discourse.org/u/aegis.five)
#### Post date: [2024年五月21日 13:59 UTC](https://meta.discourse.org/t/game-dev-user-registration-db-management-advice-needed/308874/1 "2024-05-21T13:59:25Z")

</div>

大家好，希望你们一切都好。

这只是一个关于方向的通用求助——我们希望使用 Discourse 的注册/用户管理/数据库将相同的详细信息注册到我们的外部游戏数据库中（这样玩家就可以使用相同的登录详细信息登录游戏）。

目前正在浏览 git 仓库以了解事物的工作原理等。

如前所述，总体计划是，当用户在论坛上注册时，Discourse 将在我们的游戏数据库（托管在另一个 vps 上）中注册用户详细信息。如果他们更新密码或电子邮件，这些也会反映在我们的 SQL 数据库中。

几个小时前已经成功运行了一个自托管的 Discourse 论坛，所以目前还在学习 Discourse。

那么我的问题是，在 Discourse 中是否有任何地方我们应该首先着手处理这个问题？

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2024年五月21日 14:16 UTC](https://meta.discourse.org/t/game-dev-user-registration-db-management-advice-needed/308874/2 "2024-05-21T14:16:02Z")

</div>

魔法词是“[DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)”和“identity provider” 😉

> [@Use Discourse as an identity provider (SSO, DiscourseConnect)](https://meta.discourse.org/t/use-discourse-as-an-identity-provider-sso-discourseconnect/32974):
>
> So you want to use Discourse as an identity provider for your own web app? Great! Let’s get started. Enable [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) provider setting Under Discourse admin site settings (/admin/site\_settings) enable setting enable discourse connect provider and add a secret string to discourse connect provider secrets (used to hash SSO payloads). Implement [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) in your web app: Generate a random [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce). Let’s call this value NONCE. Save it temporarily so that you can verify it with the …

---

<div class="post-metadata">

### Author: ![aegis.five](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/aegis.five/32/387477_2.png) [@aegis.five](https://meta.discourse.org/u/aegis.five)
#### Post date: [2024年五月21日 14:30 UTC](https://meta.discourse.org/t/game-dev-user-registration-db-management-advice-needed/308874/3 "2024-05-21T14:30:21Z")

</div>

好的，谢谢发过来！

---

<div class="post-metadata">

### Author: ![aegis.five](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/aegis.five/32/387477_2.png) [@aegis.five](https://meta.discourse.org/u/aegis.five)
#### Post date: [2024年五月21日 15:31 UTC](https://meta.discourse.org/t/game-dev-user-registration-db-management-advice-needed/308874/4 "2024-05-21T15:31:15Z")

</div>

这看起来像是 SSO / DiscouseConnect 需要第三方验证电子邮件。

这对我们的特定设置来说是个问题，因为我们希望 Discourse 像往常一样处理电子邮件验证和帐户管理，但只需将数据库信息传递给我们的游戏数据库。

所以本质上是 SSO 的反向操作。

简单来说：Discourse 需要处理所有事情，我只需要从它的数据库中获取一些用户信息。

---

<div class="post-metadata">

### Author: ![renato](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/renato/32/383632_2.png) [@renato](https://meta.discourse.org/u/renato)
#### Post date: [2024年五月21日 15:52 UTC](https://meta.discourse.org/t/game-dev-user-registration-db-management-advice-needed/308874/5 "2024-05-21T15:52:43Z")

</div>

当您使用 Discourse 作为身份提供者（正如 Richard 所建议的）时，Discourse 会为您处理电子邮件验证。

当用户在 Discourse 上完成 SSO 流程然后返回到您的网站时，您可以使用 Discourse 添加的响应，该响应作为嵌入式查询字符串附加到 `sso` 参数中，其中包含电子邮件、用户名、姓名、用户组等（但不是密码，那 **不** 是好主意），您可以提取并使用提供的 `sig` 正确验证。

> [@techAPJ](#):
>
> ## 从 Discourse 获取响应：
> 
> 如果上述步骤正确完成，Discourse 将把已登录的用户重定向到提供的 `RETURN_URL`。您将收到带有 `sig` 和 `sso` 以及一些用户信息查询字符串参数。现在请按照以下步骤操作：
> 
> - 使用 sso 提供者密钥作为您的密钥，计算 `sso` 的 HMAC-SHA256。
> - 将 `sig` 从其十六进制字符串表示形式转换回字节。
> - 确保上述两个值相等。
> - Base64 解码 `sso`；您将获得传递的嵌入式查询字符串。其中将有一个名为 `nonce` 的键，其值应与最初传递的 nonce 匹配。请确保情况确实如此，并务必从系统中删除 nonce。
> - 您会发现此查询字符串还将包含大量用户信息。根据需要使用。

---

<div class="post-metadata">

### Author: ![aegis.five](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/aegis.five/32/387477_2.png) [@aegis.five](https://meta.discourse.org/u/aegis.five)
#### Post date: [2024年五月26日 09:07 UTC](https://meta.discourse.org/t/game-dev-user-registration-db-management-advice-needed/308874/6 "2024-05-26T09:07:05Z")

</div>

好的。

正如前面提到的，Discourse 不会将信息发送到网站。

它是一个游戏服务器——也就是一个运行 MySQL 的 VPS。

旧的工作流程是这样的：  
Unity 在用户“注册账户”时填充 SQL 表。

我想做的是使用 Discourse 作为注册和账户管理提供商。

也就是说，他们通过 Discourse 注册，并使用这些信息通过 Unity 客户端登录游戏服务器。

因此，我需要一种可靠的方法将 Discourse 用户数据传输到 MySQL 数据库。  
（它们都在同一台机器上）。

为此，我们为 Postgres 设置了一个外部数据包装器 → Mysql，然后设置触发器进行相应的填充。

然后，当用户在游戏中输入他们的（Discourse）电子邮件和密码时，他们应该能够登录——理论上是这样。

我最近读到的另一个问题是 Discourse 使用的密码哈希（这有很多原因，是件好事），但这意味着哈希是唯一的，所以不能那样做。

所以再说一遍，没有用于 SSO 的网站，只有 Discourse 和另一个运行视频游戏服务器的 VPS，客户端会连接到该服务器。
