所以我正在尝试创建一个 discord bot 仪表板,并且我包含了一个 Discord Oauth2 来获取用户信息。我的 Discord Oauth2 可以工作,但是在授权后,它会将我重定向到主页,但 URL 具有 token=undefined 。控制台确实记录了“它有效!”。如何修复未定义的访问令牌?
http://localhost:3000/?token=undefined
var path = require('path');
const express = require('express');
const fetch = require('node-fetch');
const app = express();
require('dotenv').config();
const btoa = require('btoa');
const { catchAsync } = require('./utils.js')
const CLIENT_ID = process.env.CLIENT_ID;
const CLIENT_SECRET = process.env.CLIENT_SECRET;
const redirect = encodeURIComponent('http://localhost:3000/callback');
...
app.get('/login', (req, res) => {
res.redirect(`https://discord.com/api/oauth2/authorize?client_id=${CLIENT_ID}&redirect_uri=${redirect}&response_type=code&scope=identify%20email%20guilds`);
});
app.get('/callback', catchAsync(async (req, res) => {
if (!req.query.code) throw new Error('NoCodeProvided');
const code = req.query.code;
const creds = btoa(`${CLIENT_ID}:${CLIENT_SECRET}`);
const response = await fetch(`https://discordapp.com/api/oauth2/token?grant_type=authorization_code&code=${code}&redirect_uri=${redirect}`,
{
method: 'POST',
headers: {
Authorization: `Basic ${creds}`,
},
});
const json = await response.json();
console.log("it works!")
res.redirect(`/?token=${json.access_token}`);
}));
app.listen(3000)
答案 0 :(得分:0)
回调链接的设置方式似乎有问题,所以我将其更改为如下所示并且有效。
app.get('/callback', catchAsync(async (req, res) => {
const data = {
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
grant_type: 'authorization_code',
redirect_uri: redirect,
code: req.query.code,
scope: ['identify', 'email', 'guilds'],
};
const response = await fetch('https://discord.com/api/oauth2/token', {
method: 'POST',
body: new URLSearchParams(data),
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}
})
const json = await response.json();
const fetchDiscordUserInfo = await fetch('http://discordapp.com/api/users/@me', {
headers: {
Authorization: `Bearer ${json.access_token}`,
}
});
const userInfo = await fetchDiscordUserInfo.json();
res.redirect('http://localhost:3000/dashboard')
console.log(userInfo);