Estoy creando un inicio de sesión de Discord, pero cuando me redirigen, aparece el error. El error ocurre después de presionar autorizar en la página de Discord OAuth {"status":"ERROR","error":"Response code 400 (Bad Request)"} Aquí está mi código para Discord.js
const express = require('express'); const router = express.Router(); const fetch = require('got'); const btoa = require('btoa'); const { catchAsync } = require('../utils'); const CLIENT_ID = '#'; const CLIENT_SECRET = '#'; const redirect = encodeURIComponent('https://ezapplications.live/api/discord/callback'); router.get('/callback', catchAsync(async (req, res) => { if (!req.query.code) throw new Error('NoCodeProvided'); const response = await fetch(`https://discordapp.com/api/oauth2/authorize?client_id=${CLIENT_ID}&scope=identify&response_type=code&redirect_uri=${redirect}`, { method: 'POST', body: new URLSearchParams({ client_id: CLIENT_ID, client_secret: CLIENT_SECRET, grant_type: "authorization_code", redirect_uri: "https://ezapplications.live/api/discord/callback", code: req.query.code }) }); const json = await response.json(); res.redirect(`/?token=${json.access_token}`); })); router.get('/login', (req, res) => { res.redirect(`https://discordapp.com/api/oauth2/authorize?client_id=${CLIENT_ID}&scope=identify&response_type=code&redirect_uri=${redirect}`); }); module.exports = router;Aquí está mi código para Server.js
const express = require('express'); const path = require('path'); const app = express(); app.get('/', (req, res) => { res.status(200).sendFile(path.join(__dirname, 'index.html')); }); app.use('/api/discord', require('./api/discord')); app.use((err, req, res, next) => { switch (err.message) { case 'NoCodeProvided': return res.status(400).send({ status: 'ERROR', error: err.message, }); default: return res.status(500).send({ status: 'ERROR', error: err.message, }); } }); app.listen(50451, () => { console.info('Running on port 50451'); });Aquí está el código para utils.js
// async/await error catcher const catchAsyncErrors = fn => ( (req, res, next) => { const routePromise = fn(req, res, next); if (routePromise.catch) { routePromise.catch(err => next(err)); } } ); exports.catchAsync = catchAsyncErrors;No estoy seguro de por qué me sale este error ya que todo me parece bien, gracias.
Según los documentos de concesión de código de autorización , debe pasar los parámetros en el cuerpo de la solicitud en lugar de la cadena de consulta.
const response = await fetch("https://discord.com/api/oauth2/token", { method: 'POST', headers: { "content-type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ client_id: CLIENT_ID, client_secret: CLIENT_SECRET, grant_type: "authorization_code", redirect_uri: "https://ezapplications.live/api/discord/callback", code: req.query.code }).toString() });Con respecto a la autenticación HTTP básica...
También puede pasar su
client_idyclient_secretcomo autenticación básica conclient_idcomo nombre de usuario yclient_secretcomo contraseña.
... pero realmente no veo el punto. Tu elección