Discord OAuth 代码使用

Discord OAuth Code Usage

我有兴趣使用 Discord API 与 Discord 交互。我会将他们的文档描述为“稀疏”,但也许我只是没有找对地方。我的大部分信息来自此页面:

https://discordapp.com/developers/docs/topics/oauth2

我已经设置了我的 Discord 公会和应用程序(甚至是机器人,这可能是不必要的)。我的具体计划是让用户允许我的网站将他们添加到私人 Discord guild/server。我在我网站的某个页面上有一个超链接引用了这个 URL:

https://discordapp.com/api/oauth2/authorize?client_id=[ClientID]&scope=guilds.join&response_type=code&redirect_uri=[RedirectURI]

这部分看起来效果不错。用户批准请求。然后,用户将在查询字符串中使用“代码”key-value 对发送回我的站点。我认为这个代码就是所谓的“授权代码”。那么如何使用这个授权码将用户添加到我的行会呢?我在 Discord 网站上找到了这个页面:

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

从那个页面我可以看到我需要启动一个 PUT 到这个 URL:

https://discordapp.com/api/guilds/{guild.id}/members/{user.id}

但我不知道{user.id}。我只有一个授权码。

它还说,“...前提是您拥有 guilds.join 范围内用户的有效 oauth2 访问令牌。”我没有访问令牌。同样,我只有授权码。

所以在我看来,我需要以某种方式将此授权码交换为访问令牌和用户 ID。有人可以告诉我该怎么做吗?我一直在尝试以下 URL,但我不知道用什么方法(GET、POST 等)或发送什么参数:

https://discordapp.com/api/oauth2/token

因为我想了解它的工作原理,所以我更愿意知道如何使用普通的 Web 请求(例如 HttpWebRequest 和 WebClient,而不是使用某些 OAuth 库)。

更新

我决定(有选择地)阅读此 RFC:

https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3

我已经链接了我认为最合适的部分。似乎正确的程序是向以下 URL 和参数发送 POST 请求:

https://discordapp.com/api/oauth2/token

grant_type=authorization_code&code=[AuthorizationCode]&redirect_uri=[RedirectURI]&client_id=[ClientID]

这似乎也符合Peter G的回答。不幸的是,此请求因 401(未授权)错误而失败。所以我认为这是一个死胡同。我已经尝试了好几次,但希望有一个解决方案。我收到了这个回复 body:

{"error": "invalid_client"}

我收到了这些 headers:

Connection: close

Pragma: no-cache

Strict-Transport-Security: max-age=31536000; includeSubDomains

Alt-Svc: clear

CF-RAY: [RedactedJustInCase]

Content-Length: 27

Cache-Control: no-store

Content-Type: application/json

Date: Fri, 07 Apr 2017 01:12:19 GMT

Set-Cookie: __cfduid=[RedactedJustInCase]; expires=Sat, 07-Apr-18 01:12:19 GMT; path=/; domain=.discordapp.com; HttpOnly

Server: cloudflare-nginx

Via: 1.1 google

就获取 OAuth 令牌而言,您就快完成了。您只需要使用您 link 编辑的文档中列出的其他 URL,https://discordapp.com/api/oauth2/token. POST to it with the following parameters: https://discordapp.com/api/oauth2/token?client_id=[ClientID]&grant_type=authorization_code&code=[AuthorizationCode]&redirect_uri=[RedirectURI]&client_secret=[Secret] 其中 AuthorizationCode 是第一个 URL 中的 return ] 而 Secret 是您在首次注册您的应用程序时获得的客户端密码。

这应该会在响应 body 中为您取回客户端令牌(以及令牌过期所需的时间)。至于获取用户 object,您需要将范围 identify 添加到第一个请求,以便您可以使用令牌调用 https://discordapp.com/developers/docs/resources/user#get-current-user (以防 link 中断,它是GET users/@me)。 API 将 return 用户 object 以 JSON 形式。

最后,您可以使用刚刚获得的object用户PUT-ing将用户添加到https://discordapp.com/api/guilds/[guild.id]/members/[user.id]

获取客户​​端令牌后使用API时(获取用户object并将用户放入行会的),需要将令牌放在HTTP请求中在授权 header 下使用 Bearer 身份验证方案。基本上,这意味着 header 应该设置为 "Bearer TOKEN_HERE"。如果您还没有使用 content-type "application/x-www-form-urlencoded",您还应该使用它。

如果您在这里有什么不明白的地方,我强烈建议您阅读源代码 RFC 中有关 oauth 的内容(别担心,这两部分很短):getting an auth code, getting a token, authenticating with Bearer scheme。它们是您不使用图书馆时的休息时间。