# 向个人资料添加已验证的第三方账户的最佳方法

**URL:** <https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166>\
**Category:** Development\
**Created:** [2020年五月28日 23:09 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166 "2020-05-28T23:09:07Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![cookieman768](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cookieman768/32/118511_2.png) [@cookieman768](https://meta.discourse.org/u/cookieman768)\
**Post date:** [2020年五月28日 23:09 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166/1 "2020-05-28T23:09:07Z")

</div>

基本上，我想让用户验证他们是否拥有某些不支持 OpenID 或 OAuth 的社交账号（例如 Riot 账号）。实现这一点的最佳方法是什么？是否可以让用户将 Discourse 用作 OAuth 提供者，供外部应用程序通过其编辑数据库？我对 Discourse 还不太熟悉，因此正在思考实现此类功能的最佳方式。

---

<div class="post-metadata">

**Author:** ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)\
**Post date:** [2020年五月29日 17:55 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166/2 "2020-05-29T17:55:52Z")

</div>

我相信 @falco 在 Riot 方面很有经验？

---

<div class="post-metadata">

**Author:** ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)\
**Post date:** [2020年五月29日 18:46 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166/3 "2020-05-29T18:46:13Z")

</div>

> [@cookieman768](#):
>
> 我试图让用户验证他们是某些社交账号的所有者，而这些账号没有 OpenID 或 OAuth（例如 Riot 账号）。对于这种情况，最好的方法是什么？

哦，这确实是个有趣的问题。我们曾尝试过一种方法，就是使用 Keybase。他们本身就拥有一套成熟的身份验证系统，适用于多个平台。你可以在这里了解我们的实验：[Discourse Keybase 验证](https://meta.discourse.org/t/discourse-keybase-proof/115239)。不过，自从 Zoom 收购了 Keybase 之后，情况如何我就不太确定了。

> [@cookieman768](#):
>
> 是否可以让用户使用 Discourse 作为 OAuth 提供商，以便外部应用通过它编辑数据库？

这部分有点令人费解。Discourse 作为 Riot 的身份提供商（IdP），如何帮助你在 Discourse 上证明你拥有现有的 Riot/Matrix 账号呢？

你能再多解释一下吗？我昨天研究了 Matrix 的单点登录（SSO），他们现在终于有了相关功能。他们同时实现了 SAML，并在 `develop` 分支上实现了 OAuth2。Discourse 既不能作为服务器与它们通信，只能作为客户端使用。因此，我考虑过是让 Discourse 充当 OAuth2 服务器，还是在 Synapse 中添加对 Discourse 自有 SSO 协议的支持。不过，我不确定这是否能满足你的需求……

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2020年五月29日 18:55 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166/4 "2020-05-29T18:55:29Z")

</div>

Riot 是否提供某个用户可以控制的公开 URL？比如一个用户可插入代码的公开个人资料简介？这样，Discourse 插件可以生成一段代码，用户将其插入自己的个人资料简介中。当用户输入其 Riot 用户名时，系统会检查 `URL/<riot-username>/bio` 中是否包含该代码。

这样的系统可以支持一个较为通用的插件，通过一些系统设置即可配置为适配多个第三方站点。

---

<div class="post-metadata">

**Author:** ![riking](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/riking/32/170938_2.png) [@riking](https://meta.discourse.org/u/riking)\
**Post date:** [2020年五月29日 22:08 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166/5 "2020-05-29T22:08:23Z")

</div>

我支持采用的标准是“双向链接 `rel="me"`

---

<div class="post-metadata">

**Author:** ![cookieman768](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cookieman768/32/118511_2.png) [@cookieman768](https://meta.discourse.org/u/cookieman768)\
**Post date:** [2020年五月29日 23:41 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166/6 "2020-05-29T23:41:33Z")

</div>

> [@Falco](#):
>
> 这部分听起来有点奇怪。Discourse 作为 Riot 的身份提供商（IdP），如何帮助你在 Discourse 上证明你拥有现有的 Riot/Matrix 账户？

我的意思是，将 Discourse 作为我自己独立程序的身份提供商（IdP）。我只是不确定链接 Riot Games ID 这类信息的最佳方式，因为他们目前还没有公开的 OAuth 解决方案。我知道他们刚刚宣布了 RSO，但尚未公布其公开可用的日期。

目前，第三方应用程序要“验证”Riot 账户，需要用户登录《英雄联盟》客户端，并在设置选项卡下更改某个字段。我刚才只是在尝试寻找一种方法，从 Discourse 连接到 League API，然后在验证通过后添加自定义个人资料字段。

以下是代码部分，供参考。基本上，我随后可以调用 League API，检查该代码的值是否与他们被指示使用的值匹配。

 ![image](https://global.discourse-cdn.com/meta/original/3X/1/e/1eb2082a28655b860412a0d24a171b755296828d.png)

另外，我的 Discourse 使用的是 SAML 登录系统，因为它与我的其他网站集成在一起。我想以类似的方式添加“已验证”的 Discord 用户名。同样，我不太确定如何让 Discourse 上的已登录用户通过 Discord OAuth 触发 OAuth 流程，然后在 Discourse 端更新相应的值。

希望这能解释清楚我的意图。如果你还需要更多关于我想做什么的信息，我可以提供更多。我目前只想在个人资料中展示已验证的账户。我计划支持 Minecraft（Mojang）、Discord 和 Riot Games（《英雄联盟》），但为了我的使用场景，这些值必须经过验证，以避免身份冒充。

---

<div class="post-metadata">

**Author:** ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)\
**Post date:** [2020年五月30日 02:33 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166/7 "2020-05-30T02:33:23Z")

</div>

> [@cookieman768](#):
>
> 我的意思是，将 Discourse 作为我自己独立程序的身份提供商（IdP）。我只是不确定，像 Riot Games ID 这类东西的最佳链接方式是什么，因为他们目前还没有公开的 OAuth 解决方案。我知道他们刚刚宣布了 RSO，但尚未公布其公开可用的日期。

我认为用于《无畏契约》（Valorant）测试版发放的 Twitch 与 Riot 之间的链接使用的是 OAuth2，地址是 [https://auth.riotgames.com/login。不确定您是否能自行创建](https://auth.riotgames.com/login%E3%80%82%E4%B8%8D%E7%A1%AE%E5%AE%9A%E6%82%A8%E6%98%AF%E5%90%A6%E8%83%BD%E8%87%AA%E8%A1%8C%E5%88%9B%E5%BB%BA) client\_id。

> [@cookieman768](#):
>
> 基本上，这样我就能调用 League API，并检查该代码的值是否与对方被指示使用的值匹配。

嗯，这听起来可以通过自定义插件实现！

> [@cookieman768](#):
>
> 我的 Discourse 使用的是 SAML 登录系统，因为它与我的其他网站集成在一起，所以我希望能以类似的方式添加“已验证”的 Discord 用户名。

使用我们原生的 Discord 集成应该就能实现。只需启用 Discord 登录，用户就可以在其个人资料中关联自己的 Discord 账号。

---

<div class="post-metadata">

**Author:** ![cookieman768](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cookieman768/32/118511_2.png) [@cookieman768](https://meta.discourse.org/u/cookieman768)\
**Post date:** [2020年五月30日 04:09 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166/8 "2020-05-30T04:09:51Z")

</div>

> [@Falco](#):
>
> 我认为用于《无畏契约》（Valorant）测试版发放的 Twitch 与 Riot 之间的链接采用的是 OAuth2，地址是 [https://auth.riotgames.com/login。不确定你是否能够自行创建](https://auth.riotgames.com/login%E3%80%82%E4%B8%8D%E7%A1%AE%E5%AE%9A%E4%BD%A0%E6%98%AF%E5%90%A6%E8%83%BD%E5%A4%9F%E8%87%AA%E8%A1%8C%E5%88%9B%E5%BB%BA) client\_id。

是的，目前该功能尚未公开，仍处于早期阶段。他们在开发者网站上的这篇文章中提到了相关内容：[https://www.riotgames.com/en/DevRel/rso。](https://www.riotgames.com/en/DevRel/rso%E3%80%82)

> [@Falco](#):
>
> 嗯，那听起来通过自定义插件是可行的！

我也是这么想的，所以我会尝试看看能否实现。

> [@Falco](#):
>
> 使用我们原生的 Discord 集成应该就可以实现。只需启用 Discord 登录，用户即可在其个人资料中关联自己的 Discord 账号。

我没有尝试使用原生 Discord 集成的唯一原因是，我其他网站已经通过一个主身份提供商（IdP）实现了认证，我希望用户在整个网站中只需创建一个账户，这样更合理。我会尝试让《英雄联盟》插件运行起来，并评估实现我设想的功能的难度。我只是不太确定是否可以从 PHP 应用程序或类似环境中访问和编辑用户资料。最终，我原本只是想用 PHP 实现一个简单的 OAuth 登录系统，让用户通过 Discord 登录，但我目前遇到的问题是：除非我能通过 Discourse 发起请求，并让 PHP 脚本验证该请求的合法性，否则我无法“告知”PHP 脚本是哪个用户发起了请求。

非常感谢大家在这里的回复！我刚开始管理自己的 Discourse 论坛，非常感激大家的帮助。😃

---

<div class="post-metadata">

**Author:** ![cookieman768](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cookieman768/32/118511_2.png) [@cookieman768](https://meta.discourse.org/u/cookieman768)\
**Post date:** [2020年六月2日 05:41 UTC](https://meta.discourse.org/t/best-way-to-add-verified-third-party-accounts-to-profile/153166/9 "2020-06-02T05:41:39Z")

</div>

好吧，我得查一下插件是否比通过 API 的外部程序拥有更多权限，因为我在 [https://docs.discourse.org/](https://docs.discourse.org/) 上找不到任何通过 API 编辑用户字段的方法。
