Ad

Axios.post Results In Bad Request - Grant_type:'client_credentials'

- 1 answer

My axios POST method is not working fine. While the call syntax appears to be correct, I guess there is somewhat deep-rooted issue in my specific case. I am trying to get access token using grant_type=client_credentials, using a POST request to fiware IDM server. The call results in 400: bad request.

curl command works just great. It seems there is a CORS violation when I use simple http request, hence I switched to using node. I tried axios by sending data in separate body, it didn't work either, then someone suggested to send the data in the call using axios.post, it also ended in same problem. Note: I have tried grant_type=password, however, that also met same fate.

axios.post('https://account.lab.fiware.org/oauth2/token',{ 
'grant_type':'client_credentials'},{
headers: 
{
'Content-Type':'application/x-www-form-urlencoded',     
'Authorization': 'Basic xxxx'   
}

}).then((response) => {
    console.log(response);
    }).catch((error) =>{
    console.log(error.response.data.error);
    })

I expect to get the access token, however, I am getting error 400 as below:

{ message: 'grant_type missing in request body: {}',
code: 400,
title: 'Bad Request' }
Ad

Answer

The issue is because the host at https://account.lab.fiware.org/oauth2/token expects body data to be x-www-form-urlencoded but axios is converting the body to json for you. That is the default behaviour with axios.

Change your axios code to send x-www-form-urlencoded body data like:

// use querystring node module
var querystring = require('querystring');

axios.post('https://account.lab.fiware.org/oauth2/token',{
  // note the use of querystring
  querystring.stringify({'grant_type':'client_credentials'}),{
  headers: {
    'Content-Type':'application/x-www-form-urlencoded',     
    'Authorization': 'Basic xxxx'   
  }
}).then(...
Ad
source: stackoverflow.com
Ad