我正在尝试通过Discord API OAuth2身份验证流程(常规应用程序而非机器人)获取用户电子邮件。
我可以成功完成OAuth2流程并让用户允许权限让我的应用程序查看他们的电子邮件。我将使用电子邮件mmaines@cisco.com(第二个测试用户)下的测试帐户。
然而,即使我以完全不同的用户身份登录,并按照OAuth2流程获取访问令牌,api / v6 / users / @ me端点也始终返回我的2个测试用户的原始用户对象(甚至如果它甚至不能访问该帐户,因为访问令牌是针对第二个测试用户的。)
下面我将引导您完成我正在使用的整个过程
使用第二个测试帐户的OAuth2授权网址
OAuth2 Authorization URL Using 2nd Test Account Screenshot
在链接的屏幕截图中,请注意此处请求的电子邮件是mmaines@cisco.com
server.js(授权代码回调)
以下是来自OAuth2授权的回调
server.get('/auth/discord/callback', function(req, res) {
const discordUID = req.query.state;
// Get the access token with email and identify scopes on the mmaines-cisco user
axios.post(`https://discordapp.com/api/oauth2/token?grant_type=client_credentials&client_id=344539394373582849&client_secret=Cck2cchaqQiLCRASTXhcDwHZscNFLW7u&code=${req.query.code}&scope=email+identify&state=${req.query.state}`, {})
.then(function(response) {
console.log(response.data);
res.cookie("access_token", response.data.access_token);
res.redirect("/discord/tag-email/");
}).catch(function(err) {
console.log(err);
res.status(500).send(err);
});
});
收到了Access_Token
{
access_token: 'loUOWKzOgUj45PSkbGoXUFgY6wQS52',
token_type: 'Bearer',
state: '347013221682511873',
expires_in: 604800,
scope: 'email identify'
}
以上是来自/ api / oauth2 / token端点的响应,请注意access_token并注意状态密钥,该状态密钥正在验证访问其电子邮件的用户的Discord用户ID
重定向页面
此页面是用户在接受授权并允许访问其电子邮件和用户信息后结束的位置。在这里,我在客户端运行api请求,以确保/ users / @ me资源是他们的帐户
请注意,access_token作为cookie传递给客户端(我也尝试将其作为url参数传递,并且结果相同)
index.hbs
<h1>Thank You!</h1>
<h3>Your membership is being unlocked now!</h3>
{{access_token}}
<script>
console.log(`Bearer {{access_token}}`);
axios.get(`https://discordapp.com/api/v6/users/@me`, {
headers: {
"Authorization": `Bearer {{access_token}}`,
"Content-Type": "application/x-www-form-urlencoded"
}
})
.then(function(response) {
console.log("USER: ", response.data);
})
.catch(function(err) {
console.log(err);
});
</script>
用户授权后的索引路径的屏幕截图和来自Discord API的接收用户对象
ScreenShot of the recieved user object from the Discord API
请注意,用户名,用户ID 和电子邮件都与预期值不同(这些是我的值主要考试帐户)。我从所有discord客户端的主要测试帐户注销,并作为我的第二个测试用户登录到Web客户端。
另请注意,打印出来的access_token与我们在获得第二个测试帐户授权后从api收到的相同
问题
我不确定为什么api / v6 / users / @ me端点返回一个用户对象
关于这是为什么的任何想法?感谢您阅读本文,并提前感谢您的帮助。