TKoL TKoL - 1 month ago 13
Node.js Question

Authenticating to Dynamics NAV for OData

I'm trying to write a node.js script that uses a Dynamics NAV Odata feed.

I have both a UserAccount/PW and a Web Services Access Key from my Dynamics NAV setup.

I can't for the life of my find out how to properly authenticate, either by adding something in a header or by adding something in the URL query. I've tried using the 'username:password@server' format. I've tried encoding that as base64 and adding that in the Header for the 'Authentication' value.

The documentation itself is incredibly non-specific. I know how to generate the key, but I don't know how to properly send that key to NAV to authenticate.

I'm using the 'request-promise' npm package, which takes an 'options' argument that I can add arbitrary header key:value pairs into. Please someone give me some direction about how to authenticate to NAV. I've been on this for hours.

Answer

I found a satisfactory answer.

Using node-libcurl I was able to cURL to a url using the format

http://username:password@<server>/ODATA_table

specifically my cURL module looks like this:

var Curl = require('node-libcurl').Curl;

var curl = new Curl(),
    close = curl.close.bind(curl);

function getOData(url) {
    return new Promise((resolve, reject) => {
        curl.setOpt(Curl.option.URL, url);
        curl.setOpt(Curl.option.HTTPAUTH, Curl.auth.NTLM);
        curl.setOpt(Curl.option.SSL_VERIFYPEER, false);
        curl.setOpt(Curl.option.SSL_VERIFYHOST, false);
        curl.setOpt(Curl.option.POST, 0);


        curl.on('end', function (statusCode, body, headers) {

            var retObj = JSON.parse(body);
            resolve(retObj);

        });

        curl.on( 'error', function(e){
            reject(e);
            this.close();
        });

        curl.perform();
    })
}

module.exports = {getOData: getOData};

But I have to explicitly ask for json in the url, like ?format=json.

Comments