Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 838
TKoL Avatar asked Oct 21 '16 16:10

TKoL


People also ask

How do I find my nav instance?

Open Development Environment, Connect to your NAV database, then click on File, Database, Informations. Here you have a window where you can select a NAV server instance where your database is connected. Check that it's not empty and select the correct NAV server instance (url).

How do I open NAV web client?

Open the web browser. On the computer where the Microsoft Dynamics NAV Web Server components are installed, you can open the Microsoft Dynamics NAV Web client directly from Start in Windows. In the Search box, type Microsoft Dynamics NAV 2018 Web Client, and then choose the related link.


1 Answers

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

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

        curl.perform();
    })
}

module.exports = {getOData: getOData};

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

like image 77
TKoL Avatar answered Oct 04 '22 20:10

TKoL