尽管访问令牌明显有效,但不和谐添加公会成员 401 错误

use*_*179 6 c# oauth httpwebrequest oauth-2.0 discord

我是 Discord 的 API 的新手,我正在处理一个需要能够以编程方式添加公会成员的项目。我已经学会了如何获取授权代码(带有标识和 guilds.join 范围),将其兑换为访问令牌,并获取用户 ID。最后一步是使用访问代码和用户ID添加公会。这个命令在这里有详细说明:

https://discordapp.com/developers/docs/resources/guild#add-guild-member

看来我需要向这个 URL 发送一个 PUT 请求:

https://discordapp.com/api/guilds/[GuildID]/members/[UserID]

但这会导致以下响应:

{"code": 0, "message": "401: Unauthorized"}

我尝试在授权标头中包含访问令牌:

授权:承载 [已编辑]

我还尝试向请求添加 JSON 正文:

{"access_token":"[已编辑]"}

两者都没有奏效。不出所料,同时使用两者也不起作用。

我想知道这是否是权限问题,但 Discord 确认我有 guilds.join 范围。这是我在为访问令牌交换授权码时收到的 JSON:

{"access_token": "[Redacted]", "token_type": "Bearer", "expires_in": 604800, "refresh_token": "[Redacted]", "scope": "identify guilds.join"}

识别范围有效,因为我能够检索用户及其 ID。但是 guilds.join 似乎不起作用。

我在下面包含了一些测试代码。我已标记“选项 1”和“选项 2”行以表示我通常不会在同一请求中同时使用这两种访问代码方法。但正如我之前提到的,我确实尝试了两者,但仍然出现 401 错误。

using (WebClient client = new WebClient())
{
    client.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
    client.Headers.Add(HttpRequestHeader.Authorization, "Bearer [Redacted]");//Option 1
    string output = client.UploadString
    (
        "https://discordapp.com/api/guilds/[GuildID]/members/[UserID]",
        WebRequestMethods.Http.Put,
        "{\"access_token\":\"[Redacted]\"}"//Option 2
    );
}
Run Code Online (Sandbox Code Playgroud)

因为我想了解它是如何工作的,所以我更想知道如何使用普通的 Web 请求(例如 HttpWebRequest 和 WebClient,而不是使用某些 OAuth 库)来做到这一点。

use*_*179 6

我正在回答我自己的问题,因为我可能已经想到了这一点。当我执行以下操作时它有效:

using (WebClient client = new WebClient())
{
    client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
    client.Headers.Add(HttpRequestHeader.Authorization, "Bot [Redacted]");
    string output = client.UploadString
    (
        "https://discordapp.com/api/guilds/[GuildID]/members/[UserID]",
        WebRequestMethods.Http.Put,
        "{\"access_token\":\"[Redacted]\"}"
    );
}
Run Code Online (Sandbox Code Playgroud)

请注意,我将内容类型从“application/x-www-form-urlencoded”更改为“application/json”。我从使用“Bearer”的授权标头更改为“Bot”,并且我正在使用我的机器人的令牌。我使用与以前相同的访问令牌。如果没有更好的解决方案,我打算接受这个答案。