Sample code for 30+ languages & platforms
Node.js

Duo Auth API - Async Auth

See more Duo Auth MFA Examples

If you enable async, then your application will be able to retrieve real-time status updates from the authentication process, rather than receiving no information until the process is complete.

Chilkat Node.js Downloads

Node.js
NODEJS_PRELUDE

function chilkatExample() {

    var success = false;

    // This example assumes the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    var integrationKey = "DIMS3V5QDVG9J9ABRXC4";
    var secretKey = "HWVQ46nubLBxhnRlKddTltWIi3hL0fIQF2qTvLab";

    var http = new chilkat.Http();

    http.Accept = "application/json";

    // Use your own hostname here:
    var url = "https://api-a03782e1.duosecurity.com/auth/v2/auth";

    // This example requires Chilkat v9.5.0.89 or greater because Chilkat will automatically
    // generate and send the HMAC signature for the requires based on the integration key and secret key.
    http.Login = integrationKey;
    http.Password = secretKey;

    var req = new chilkat.HttpRequest();
    req.AddParam("username","matt");
    req.AddParam("factor","push");
    // The device ID can be obtained from the preauth response.  See Duo Preauth Example
    req.AddParam("device","DP6GYVTQ5NK82BMR851F");
    // Add the async param to get an immediate response, then periodically check for updates to find out when the MFA authentication completes for fails.
    req.AddParam("async","1");

    req.HttpVerb = "POST";
    req.ContentType = "application/x-www-form-urlencoded";

    var resp = new chilkat.HttpResponse();
    success = http.HttpReq(url,req,resp);
    if (success == false) {
        console.log(http.LastErrorText);
        return;
    }

    console.log("status code = " + resp.StatusCode);

    var json = new chilkat.JsonObject();
    success = json.Load(resp.BodyStr);
    json.EmitCompact = false;
    console.log(json.Emit());

    if (resp.StatusCode !== 200) {
        return;
    }

    // Sample successful output:

    // status code = 200

    // {
    //   "stat": "OK",
    //   "response": {
    //     "txid": "45f7c92b-f45f-4862-8545-e0f58e78075a"
    //   }
    // }

    var txid = json.StringOf("response.txid");

    // Use your own hostname here:
    var sbUrl = new chilkat.StringBuilder();
    sbUrl.Append("https://api-a03782e1.duosecurity.com/auth/v2/auth_status?txid=");
    sbUrl.Append(txid);
    var url = sbUrl.GetAsString();

    console.log("Auth status URL: " + url);

    var sbResult = new chilkat.StringBuilder();
    var responseStatus;
    var responseStatus_msg;

    // Wait for a response...
    var i = 0;
    var maxWaitIterations = 100;
    while (i < maxWaitIterations) {
        // Wait 3 seconds.
        http.SleepMs(3000);

        console.log("Polling...");

        success = http.HttpNoBody("GET",url,resp);
        if (success == false) {
            console.log(http.LastErrorText);
            return;
        }

        if (resp.StatusCode !== 200) {
            console.log("error status code = " + resp.StatusCode);
            console.log(resp.BodyStr);
            console.log("Failed.");
            return;
        }

        // Sample response:

        // 	{
        // 	  "stat": "OK",
        // 	  "response": {
        // 	    "result": "waiting",
        // 	    "status": "pushed",
        // 	    "status_msg": "Pushed a login request to your phone..."
        // 	  }
        // 	}

        json.Load(resp.BodyStr);

        // The responseResult can be "allow", "deny", or "waiting"
        sbResult.Clear();
        json.StringOfSb("response.result",sbResult);
        responseStatus = json.StringOf("response.status");
        responseStatus_msg = json.StringOf("response.status_msg");

        console.log(sbResult.GetAsString());
        console.log(responseStatus);
        console.log(responseStatus_msg);
        console.log("");

        if (sbResult.ContentsEqual("waiting",true) == true) {
            i = i+1;
        }
        else {
            // Force loop exit..
            i = maxWaitIterations;
        }

    }

    console.log("Finished.");

}

chilkatExample();