为通过 guilds.join 范围、Discord OAuth2.0 添加到公会的用户赋予角色
Posted
技术标签:
【中文标题】为通过 guilds.join 范围、Discord OAuth2.0 添加到公会的用户赋予角色【英文标题】:Give role to users that are added to a guild through guilds.join scope, Discord OAuth2.0 【发布时间】:2019-12-05 02:25:29 【问题描述】:我想在我的网站上集成 Discord 的 OAuth2.0,这样我就可以将用户添加到我的公会并赋予他们特定的角色。
我搜索了开发者门户文档,但没有找到任何东西。
【问题讨论】:
【参考方案1】:Discord Oauth 实现在 https://discordapp.com/developers/docs/topics/oauth2 中进行了描述。您可能希望将其与 RFC 6749 一起阅读,以大致了解 Oauth 的工作原理。
您不仅需要一个 Discord“应用程序”,而且该应用程序还需要一个您已加入相关公会(即“服务器”)的 bot 帐户。 bot 需要在公会中拥有 CREATE_INSTANT_INVITE
和 MANAGE_ROLES
权限,并且bot 帐户需要在角色列表中具有高于它将分配给用户的角色的角色。另一方面,您不需要为此将机器人实际连接到 Discord websocket 网关。
步骤如下:
将用户发送到 Discord 上的授权 URL,其中包含标识您的应用程序的查询参数,并请求 identify
和 guilds.join
范围。
如果用户正确识别并批准请求,他的浏览器最终将被重定向到您选择的指向您的后端服务器的 URL。此 URL 在授权 URL 中作为参数提供,并且必须提前在您的应用控制面板中列入白名单。
常见错误: 重定向 URL 必须与白名单 URL 逐字符匹配。一个是另一个的前缀是不够的。
当您收到重定向时,是时候检查(使用会话 cookie 或您正在使用的任何东西)该用户是否是您想要添加到您的公会的人,
Discord 将某些查询字符串添加到您的后端可用于构造 令牌交换请求 到 Discord 的重定向 URL。在此请求中,您提供应用的秘密凭据以及来自重定向的加密代码,您将获得代表应用和权限组合的承载令牌你从那个特定的用户那里得到的。
常见错误: 令牌交换请求的参数之一必须再次是原始重定向 URL。这必须与您在第 1 步中使用的那个相同。即使不同的 URL也为您的应用列入白名单,它也不能是不同的 URL!
常见错误: 令牌交换请求的大部分参数都在 POST 正文中,必须以application/x-www-form-urlencoded
格式编码。有时人们使用默认将其数据编码为 JSON 的 HTTP 堆栈,并且对它不起作用感到困惑。如果您发送的 actual 数据被序列化为 JSON,则将 application/x-www-form-urlencoded
放入 Content-Type
标头将不起作用。
警告:您可能会发现一些代码示例试图将令牌交换参数作为 URL 中的查询参数而不是 POST 正文中的查询参数。 Discord曾经接受这一点,但现在不接受了。
发出一个Get current user 请求,使用您在令牌交换中获得的不记名令牌 进行身份验证。这将为您提供正在与之交谈的用户的 Discord ID。
您现在拥有发出 Add guild member 请求所需的信息,该请求已通过您的固定 bot 令牌验证并且包含 bearer token 用于 PUT 正文中的用户,这次必须是 JSON。您可以使用可选的roles
参数来设置新成员将开始使用的角色。
常见错误:这应该是一个 PUT 请求,而不是 POST。
我假设你硬编码(或配置)你管理的公会 ID 和你分配的角色。
请注意,即使 Discord ID 是(64 位)整数,它们也应该在 JSON 主体中序列化为 字符串,以便与原生不支持这么大整数的 javascript 等语言兼容.
(有关第 4 步和第 5 步身份验证的详细信息,请参阅https://discordapp.com/developers/docs/reference#authentication)。
【讨论】:
【参考方案2】:从 oauth 获取访问令牌并和我一样。 Discord Api - Add Guild Member
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 => )
【讨论】:
以上是关于为通过 guilds.join 范围、Discord OAuth2.0 添加到公会的用户赋予角色的主要内容,如果未能解决你的问题,请参考以下文章
java 给出了很多整数范围;合并重叠范围。通过对范围进行排序来确定运行时间,因此时间复杂度为n lg(n)。