【问题标题】:Bad request in discord oauth不和谐的oauth中的错误请求
【发布时间】:2023-03-29 20:40:01
【问题描述】:

我正在创建一个 Discord 登录,但是当我被重定向时,我得到了错误。我在 Discord OAuth 页面上按授权后发生错误 {"status":"ERROR","error":"Response code 400 (Bad Request)"} 这是我的 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;

这是我的 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');
});

这里是 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;

我不知道为什么会出现这个错误,因为我觉得一切都很好,谢谢。

【问题讨论】:

    标签: javascript node.js express discord


    【解决方案1】:

    根据Authorization Code Grant 文档,您需要在请求正文中传递参数而不是查询字符串。

    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()
    });
    

    关于 HTTP 基本认证...

    您还可以通过client_idclient_secret 作为基本身份验证,使用client_id 作为用户名和client_secret 作为密码

    ...但我真的不明白这一点。你的选择

    【讨论】:

    • 现在我得到错误 {"status":"ERROR","error":"body 选项必须是流。可读、字符串或缓冲区"}
    • 我更新了问题中的原始代码,让你看看我放了什么
    • 您使用的是fetch 的哪个实现?我已经用fetch 参数更新了我的答案更明确(注意headerstoString()
    • @Bobjoe12 如果您使用的是node-fetch,那么您对我的原始代码应该没有任何问题。见npmjs.com/package/…
    • 我正在使用 got。当我使用 nodefetch 时,我收到一个关于 es 的错误,以及 require 如何不能使用它。我用 .toString 和标题更新了我的代码,但现在我收到错误 {"status":"ERROR","error":"Response code 401 (Unauthorized)"}
    猜你喜欢
    • 2021-06-26
    • 2020-10-29
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多