为通过 guilds.join 范围、Discord OAuth2.0 添加到公会的用户授予角色



我想在我的网站上集成 Discord 的 OAuth2.0,这样我就可以将用户添加到我的公会中并赋予他们特定的角色。

我已经搜索了开发人员门户文档,但没有找到任何东西。

Discord Oauth 实现在 https://discordapp.com/developers/docs/topics/oauth2 中有描述。您可能希望将其与 RFC 6749 一起阅读,以大致了解 Oauth 的一般工作原理。

您不仅需要一个 Discord "应用程序",而且此应用程序还需要一个您已经加入相关公会(即"服务器")的机器人帐户。机器人需要在公会中具有CREATE_INSTANT_INVITEMANAGE_ROLES权限,并且机器人帐户的角色在角色列表中需要高于它将分配给用户的角色。另一方面,您无需为此将机器人实际连接到Discord 网络套接字网关。

步骤将是:

  1. 将用户发送到 Discord 上的授权 URL,其中包含标识您的应用程序的查询参数,并请求identifyguilds.join范围。

  2. 如果用户正确识别并批准请求,他的浏览器最终将被重定向到您选择的指向后端服务器的 URL。此 URL 作为授权 URL 中的参数提供,必须提前在应用控制面板中列入白名单。

    常见错误:重定向 URL 必须与列入白名单的 URL字符匹配。一个是另一个的前缀是不够的。

    当你收到重定向时,是时候检查(使用会话cookie或你正在使用的任何内容)用户是否是你想添加到公会的人,

  3. Discord 将某些查询字符串添加到重定向 URL 中,您的后端可以使用这些字符串来构造对 Discord 的令牌交换请求。在此请求中,你将提供应用的机密凭据以及来自重定向的加密代码,并获取一个持有者令牌,该令牌表示你的应用和你从该特定用户获得的权限的组合。

    常见错误:令牌交换请求的参数之一必须再次是原始重定向 URL。这必须与您在步骤 1 中使用的相同。它不能是不同的 URL,即使不同的 URL也被列入应用的白名单!

    常见错误:令牌交换请求的大多数参数都位于 POST 正文中,必须以application/x-www-form-urlencoded格式编码。有时人们使用默认将其数据编码为 JSON 的 HTTP 堆栈,并且对它不起作用感到困惑。如果您发送的实际数据序列化为 JSON,则application/x-www-form-urlencoded放在Content-Type标头中是行不通的。

    警告:您可能会发现一些代码示例,这些示例试图将令牌交换参数作为 URL 中的查询参数而不是 POST 正文中的查询参数提供。Discord曾经接受这一点,但现在不再了。

  4. 使用在令牌交换中获得的持有者令牌对当前用户请求进行身份验证。这为您提供了与您交谈的用户的 Discord ID。

  5. 现在,您拥有发出添加公会成员请求所需的信息,该请求使用固定的机器人令牌进行身份验证,并在 PUT 正文中包含用户的持有者令牌,这次必须是 JSON。您可以使用可选的roles参数来设置新成员开始时的角色。

    常见错误:这应该是 PUT 请求,而不是 POST。

我假设你对你正在管理的公会的ID和你分配的角色进行硬编码(或配置)。

请注意,即使 Discord ID 是(64 位)整数,它们也应该在 JSON 主体中序列化为字符串,以便与原生不支持如此大整数的语言(如 JavaScript)兼容。

(另请参阅 https://discordapp.com/developers/docs/reference#authentication 有关步骤 4 和 5 的身份验证的详细信息)。

从oauth获取访问令牌并执行与我相同的操作。
不和谐 API - 添加公会成员

await axios({
method: 'PUT',
url: `https://discord.com/api/guilds/${process.env.SERVER_ID}/members/${profile.id}`,
headers: {
'Authorization': `Bot ${process.env.CLIENT_TOKEN}`,
'Content-type': 'application/json'
},
data: {
'access_token': `${accessToken}`
}
}).then().catch(err => {})

最新更新