Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OAuth "unsupported_grant_type" Discord API

I'm trying to make the discord OAuth work. In the doc, it is necessary to generate a code, it works very well this step but after it is to generate the token. It asks to make a POST request with the right parameters but it always brings me the error: {"error":"unsupported_grant_type"}

My code:

app.get('/discord/callback', async function (req, res) {
    if (req.query.code === undefined || req.query.code == '') return next();

    const response = await fetch("https://discordapp.com/api/v6/auth2/token", {
        method: 'POST',
        headers: {
            "Content-type": "application/x-www-form-urlencoded"
        },
        data: {
            client_id: process.env.CLIENT_ID,
            client_secret: process.env.CLIENT_SECRET,
            code: req.query.code,
            redirect_uri: redirect,
            grant_type: "authorization_code",
            scope: "identify"
        }
    });
    const json = await response.json();

    debug('%O', json);
    res.send(json);
});

Doc:

def exchange_code(code):
  data = {
    'client_id': CLIENT_ID,
    'client_secret': CLIENT_SECRET,
    'grant_type': 'authorization_code',
    'code': code,
    'redirect_uri': REDIRECT_URI,
    'scope': 'identify email connections'
  }
  headers = {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
  r = requests.post('%s/oauth2/token' % API_ENDPOINT, data, headers)
  r.raise_for_status()
  return r.json()

Thanks for your help

like image 985
Maxime6678 Avatar asked Dec 22 '25 22:12

Maxime6678


1 Answers

Your headers are:

headers = {
    'Content-Type': 'application/x-www-form-urlencoded'
  }

which means that it also expects the data as form data and NOT json.

So this should work:

    app.get('/discord/callback', async function (req, res) {
      if (req.query.code === undefined || req.query.code == '') return next();

      const params = new URLSearchParams();
      params.append('client_id', process.env.CLIENT_ID);
      params.append('client_secret', process.env.CLIENT_SECRET);
      params.append('grant_type', 'authorization_code');
      params.append('code', code);
      params.append('redirect_uri', redirect);
      params.append('scope', 'identify');

      const response = await fetch("https://discordapp.com/api/v6/auth2/token", {
        method: 'POST',
        body: params
        headers: {
            "Content-type": "application/x-www-form-urlencoded"
        },
      });
     const json = await response.json();

     debug('%O', json);
     res.send(json);
 });

You can refer this for better understanding: https://www.npmjs.com/package/node-fetch#post-with-form-parameters

like image 196
Aakash Sharma Avatar answered Dec 24 '25 10:12

Aakash Sharma