Discord OAuth 代码使用
Discord OAuth Code Usage
我有兴趣使用 Discord API 与 Discord 交互。我会将他们的文档描述为“稀疏”,但也许我只是没有找对地方。我的大部分信息来自此页面:
https://discordapp.com/developers/docs/topics/oauth2
我已经设置了我的 Discord 公会和应用程序(甚至是机器人,这可能是不必要的)。我的具体计划是让用户允许我的网站将他们添加到私人 Discord guild/server。我在我网站的某个页面上有一个超链接引用了这个 URL:
这部分看起来效果不错。用户批准请求。然后,用户将在查询字符串中使用“代码”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。它们是您不使用图书馆时的休息时间。
我有兴趣使用 Discord API 与 Discord 交互。我会将他们的文档描述为“稀疏”,但也许我只是没有找对地方。我的大部分信息来自此页面:
https://discordapp.com/developers/docs/topics/oauth2
我已经设置了我的 Discord 公会和应用程序(甚至是机器人,这可能是不必要的)。我的具体计划是让用户允许我的网站将他们添加到私人 Discord guild/server。我在我网站的某个页面上有一个超链接引用了这个 URL:
这部分看起来效果不错。用户批准请求。然后,用户将在查询字符串中使用“代码”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。它们是您不使用图书馆时的休息时间。