0

I am trying to retrieve the access token from an API (https://github.com/Axosoft/node-axosoft/)

To receive an access token we have to follow this process:

var axo = nodeAxosoft(axosoftUrl, credentials);

axo.Api.getLoginUrl(function(url) {

    // open browser using authorizationUrl and get code parameter from 
   //redirected Url after login

     var code = 'code received from redirect';
     axo.Api.exchangeCodeForToken(code);
 });

As I did not understood exactly how to get the code following that example nor what is the url parameter on getLoginUrl, I did it on my own.

I have a login route that redirects the user to the axosoft website for authentication and redirects the user to the /authorization-process route on my application.

On the /authorization-process I get the code returned by the login and call a function that should get the access token by calling:

         axo.Api.exchangeCodeForToken(code);

Code:

var axosoft_code = req.query.code;

  console.log(axosoft_code);

     var token = request.exchangeAuthCodeForAccessToken(axosoft_code)
    .then(function(token)
    {
       res.send(token);
    })

The Method:

var  connection = nodeAxosoft(client_url, credentials);

  return new Promise(function(resolve, reject){
      console.log("CODE: ", axosoft_code)
      var token = connection.Api.exchangeCodeForToken(axosoft_code, function(token){
        console.log(token);
        resolve(token)
      })

The problem is that returns null

I had a look at the API lib api.js and found that:

https://github.com/Axosoft/node-axosoft/blob/master/lib/api.js

function exchangeCodeForToken(code, callback) {
    _credentials.code = code;
    _access_token = '';

    _authenticateCredentails(function (err) {
        if (!err) {
            callback(null, _access_token);
        } else {
            callback(err);
        }
    })
}

So I have two questions:

Does anyone has an Idea what am I doing wrong?

What would be necessary to code the callback function?

The method expects a callback function but I don't really know how to do it.

EDIT:

return new Promise(function(resolve, reject){
      var token = connection.Api.exchangeCodeForToken(axosoft_code, function(response,err){
        if(!err){
          console.log("token",response)
          resolve(token);
        }
        else{
          console.log("error",err)
          resolve(token);

        }
      });
    })

OR

var token = connection.Api.exchangeCodeForToken(axosoft_code, function(response,err){
        if(!err){
          console.log("token",response.body)
          return response.body;
        }
        else{
          console.log("error",err)
          return err;
        }
      });

I am giving to my callback function two args (response and err), my problem is that I am falling at the else condition. The output of err is something similar to a token though the documentation here shows that it should be like that:

{
    "error" : "invalid_request",
    "error_description" : "One or more parameters are missing: client_secret"
}

Another point is that the page is frozen waiting for something to happen but nothing happens.

EAzevedo
  • 751
  • 2
  • 17
  • 46

1 Answers1

1

Given that this is the input:

function exchangeCodeForToken(code, callback) {
    _credentials.code = code;
    _access_token = '';

    _authenticateCredentails(function (err) {
        if (!err) {
            callback(null, _access_token);
        } else {
            callback(err);
        }
    })
}

You should format your call as:

exchangeCodeForToken(axosoft_code, function(err, response) {
    if (err) {
        // Deal with error
    } else {
        // Deal with response
    }
}

Node functions often pass through error variables first so that you have to receive them, which is considered good practice.

Eliott Robson
  • 960
  • 9
  • 20
  • I had figured that out... thanks anyway. The explanation you gave me helped a lot as well! Really appreciate. – EAzevedo Mar 12 '18 at 16:35