sharepoint-adfs
Version:
sharepoint-adfs is a Node.js library for ADFS claims authentication
122 lines (97 loc) • 4.26 kB
JavaScript
/*
* Sharepoint-ADFS
* @author: Amol Eklare
* sharepoint-adfs is a Node.js library for ADFS claims authentication
* Supports only SharePoiont 2013 OnPremises
*/
;
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;
}