UNPKG

saml2

Version:

SAML 2.0 IDP-agnostic transports and logic

204 lines (138 loc) 7.79 kB
<!DOCTYPE html> <html> <head> <title>transport-post-consumer.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <ul id="jump_to"> <li> <a class="large" href="javascript:void(0);">Jump To &hellip;</a> <a class="small" href="javascript:void(0);">+</a> <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="identity-provider-example.html"> identity-provider-example.js </a> <a class="source" href="index.html"> index.js </a> <a class="source" href="identity-provider.html"> identity-provider.js </a> <a class="source" href="oasis_names_tc_saml__2_0_assertion.html"> oasis_names_tc_saml__2_0_assertion.js </a> <a class="source" href="oasis_names_tc_saml__2_0_metadata.html"> oasis_names_tc_saml__2_0_metadata.js </a> <a class="source" href="oasis_names_tc_saml__2_0_protocol.html"> oasis_names_tc_saml__2_0_protocol.js </a> <a class="source" href="oasis_names_tc_xacml__3_0_core_schema_wd_17.html"> oasis_names_tc_xacml__3_0_core_schema_wd_17.js </a> <a class="source" href="org_w3__2000__09_xmldsig.html"> org_w3__2000__09_xmldsig.js </a> <a class="source" href="org_w3__2001__04_xmlenc.html"> org_w3__2001__04_xmlenc.js </a> <a class="source" href="protocol.html"> protocol.js </a> <a class="source" href="service-provider.html"> service-provider.js </a> <a class="source" href="transport-post-consumer.html"> transport-post-consumer.js </a> <a class="source" href="transport-post.html"> transport-post.js </a> <a class="source" href="transport-redirect-consumer.html"> transport-redirect-consumer.js </a> <a class="source" href="transport-redirect-producer.html"> transport-redirect-producer.js </a> <a class="source" href="transport-redirect.html"> transport-redirect.js </a> <a class="source" href="service-provider-example.html"> service-provider-example.js </a> </div> </li> </ul> <ul class="sections"> <li id="title"> <div class="annotation"> <h1>transport-post-consumer.js</h1> </div> </li> <li id="section-1"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-1">&#182;</a> </div> </div> <div class="content"><div class='highlight'><pre><span class="keyword">var</span> querystring = require(<span class="string">"querystring"</span>), xmldom = require(<span class="string">"xmldom"</span>); <span class="keyword">var</span> protocol = require(<span class="string">"./protocol"</span>); <span class="keyword">var</span> PostConsumer = module.exports = <span class="function"><span class="keyword">function</span> <span class="title">PostConsumer</span><span class="params">(req, cb)</span> {</span> <span class="keyword">if</span> (req.method !== <span class="string">"POST"</span>) { <span class="keyword">return</span> cb(Error(<span class="string">"PostConsumer only works with POST requests"</span>)); } <span class="keyword">if</span> (!req.headers || req.headers[<span class="string">'content-type'</span>] !== <span class="string">'application/x-www-form-urlencoded'</span>) { <span class="keyword">return</span> cb(Error(<span class="string">"PostConsumer only reads x-www-form-urlencoded bodies"</span>)); } <span class="keyword">var</span> buffer = []; req.on(<span class="string">"data"</span>, <span class="function"><span class="keyword">function</span><span class="params">(chunk)</span> {</span> buffer.push(chunk); }); req.on(<span class="string">"end"</span>, <span class="function"><span class="keyword">function</span><span class="params">()</span> {</span> buffer = Buffer.concat(buffer).toString(); <span class="keyword">var</span> parsed = querystring.parse(buffer); <span class="keyword">if</span> (!parsed || (!parsed.SAMLRequest &amp;&amp; !parsed.SAMLResponse)) { <span class="keyword">return</span> cb(Error(<span class="string">"no SAML fields found in body"</span>)); } <span class="keyword">var</span> data = {}; <span class="keyword">var</span> xml = <span class="literal">null</span>; <span class="keyword">var</span> fields = [[<span class="string">"SAMLRequest"</span>, <span class="string">"samlRequestXml"</span>, <span class="string">"samlRequest"</span>], [<span class="string">"SAMLResponse"</span>, <span class="string">"samlResponseXml"</span>, <span class="string">"samlResponse"</span>]]; <span class="keyword">for</span> (<span class="keyword">var</span> k <span class="keyword">in</span> fields) { <span class="keyword">if</span> (!parsed[fields[k][<span class="number">0</span>]]) { <span class="keyword">continue</span>; } xml = Buffer(parsed[fields[k][<span class="number">0</span>]], <span class="string">"base64"</span>).toString(<span class="string">"utf8"</span>); <span class="keyword">try</span> { xml = <span class="keyword">new</span> xmldom.DOMParser().parseFromString(xml); } <span class="keyword">catch</span> (e) { <span class="keyword">return</span> cb(e); } <span class="keyword">if</span> (!xml) { <span class="keyword">return</span> cb(Error(<span class="string">"couldn't parse "</span> + fields[k][<span class="number">0</span>] + <span class="string">" field"</span>)); } <span class="keyword">try</span> { <span class="keyword">var</span> obj = protocol.fromDocument(xml.documentElement); } <span class="keyword">catch</span> (e) { <span class="keyword">return</span> cb(e); } <span class="keyword">if</span> (!obj) { <span class="keyword">return</span> cb(Error(<span class="string">"couldn't figure out how to use a "</span> + xml.documentElement.tagName + <span class="string">" to construct an object"</span>)); } data[fields[k][<span class="number">1</span>]] = xml; data[fields[k][<span class="number">2</span>]] = obj; } cb(<span class="literal">null</span>, data); }); };</pre></div></div> </li> </ul> </div> </body> </html>