UNPKG

sharepoint-adfs

Version:

sharepoint-adfs is a Node.js library for ADFS claims authentication

122 lines (97 loc) 4.26 kB
/* * Sharepoint-ADFS * @author: Amol Eklare * sharepoint-adfs is a Node.js library for ADFS claims authentication * Supports only SharePoiont 2013 OnPremises */ 'use strict'; var request = require('request'); var parseString = require('xml2js').parseString; var deasync = require('deasync'); var headers = { "Accept": "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*", "Content-Type": "application/x-www-form-urlencoded" }; module.exports.getFedAuthCookie = function (options) { var url = options.adfsServerUrl + "?wa=" + options.wa + "&wtrealm=" + options.wtrealm + "&wctx=" + options.wctx + "/_layouts/15/Authenticate.aspx" var initCookie = getInitCookie(options, url); while (initCookie === undefined) { require('deasync').runLoopOnce(); } var samlToken = getSecurityToken(initCookie, url); while (samlToken === undefined) { require('deasync').runLoopOnce(); } var fedAuthCookie = getFedAuthenticationCookie(options, samlToken); while (fedAuthCookie === undefined) { require('deasync').runLoopOnce(); } return fedAuthCookie; }; module.exports.getSAMLToken = function (options) { var url = options.adfsServerUrl + "?wa=" + options.wa + "&wtrealm=" + options.wtrealm + "&wctx=" + options.wctx + "/_layouts/15/Authenticate.aspx"; var initCookie = getInitCookie(options, url); while (initCookie === undefined) { require('deasync').runLoopOnce(); } var samlToken = getSecurityToken(initCookie, url); while (samlToken === undefined) { require('deasync').runLoopOnce(); } return samlToken; }; function getInitCookie(options, url) { var cookieData, cookieArray, initCookie, requestParameters = "UserName=" + encodeURIComponent(options.UserName) + "&Password=" + options.Password + "&AuthMethod=" + options.AuthMethod; request.post(url, { headers: headers, body: requestParameters }, function (error, response, body) { if (response != undefined) { cookieData = response.headers["set-cookie"].toString(); cookieArray = cookieData.split(';'); initCookie = cookieArray[0]; } }); while (initCookie === undefined) { require('deasync').runLoopOnce(); } return initCookie; } function getSecurityToken(initCookie, adfsURL) { var headers = { "Accept": "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*", "Content-Type": "application/x-www-form-urlencoded", "Cookie": "" + initCookie }; var cookieName = initCookie.split('='); var requestUrl = adfsURL + "&ssoCookie=" + cookieName[0]; var samlToken = undefined; request.post(requestUrl, { headers: headers }, function (error, response, body) { parseString(body, function (err, result) { if (result != undefined) { samlToken = result.html.body[0].form[0].input[1].$.value; } else { samlToken = { "500 Internal Server Error": "Something went Wrong" }; } }); }); while (samlToken === undefined) { require('deasync').runLoopOnce(); } return samlToken; } function getFedAuthenticationCookie(options, samlToken) { var cookieData, cookieArray, fedAuthCookie, requestBody = "wa=" + options.wa + "&wresult=" +encodeURIComponent(samlToken) + "&wctx=" + options.wctx + "/_layouts/15/Authenticate.aspx", url = options.RelyingPartyID; request.post(url, { headers: headers, body: requestBody }, function (error, response, body) { cookieData = response.headers["set-cookie"].toString(); cookieArray = cookieData.split(';'); fedAuthCookie = cookieArray[0]; }); while (fedAuthCookie === undefined) { require('deasync').runLoopOnce(); } return fedAuthCookie; }