UNPKG

saml2

Version:

SAML 2.0 IDP-agnostic transports and logic

228 lines (160 loc) 8.79 kB
<!DOCTYPE html> <html> <head> <title>service-provider-example.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>service-provider-example.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="regexp">/usr/</span>bin/env node</pre></div></div> </li> <li id="section-2"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-2">&#182;</a> </div> <p>This is set up to point at openidp.feide.no with the fknsrsbiz-testing idp instance. You&#39;ll probably want to set your own up, or something.</p> <p>If you want.</p> <p>I&#39;m not judging you.</p> </div> <div class="content"><div class='highlight'><pre><span class="keyword">var</span> http = require(<span class="string">"http"</span>), url = require(<span class="string">"url"</span>); <span class="keyword">var</span> saml2 = require(<span class="string">"./"</span>); <span class="keyword">var</span> sp = <span class="keyword">new</span> saml2.ServiceProvider({ entityId: <span class="string">"fknsrsbiz-testing"</span>, }); <span class="keyword">var</span> idp = <span class="keyword">new</span> saml2.IdentityProvider({ singleSignOnService: <span class="string">"https://openidp.feide.no/simplesaml/saml2/idp/SSOService.php"</span>, fingerprint: <span class="string">"C9:ED:4D:FB:07:CA:F1:3F:C2:1E:0F:EC:15:72:04:7E:B8:A7:A4:CB"</span>, }); <span class="keyword">var</span> server = http.createServer(<span class="function"><span class="keyword">function</span><span class="params">(req, res)</span> {</span> <span class="keyword">var</span> uri = url.parse(req.url, <span class="literal">true</span>); console.log(<span class="keyword">new</span> Date(), req.method, uri.path); <span class="keyword">if</span> (uri.pathname === <span class="string">"/"</span>) { <span class="keyword">return</span> saml2.Transport.Redirect.produce(res, idp, {request: sp.createAuthnRequest()}, <span class="function"><span class="keyword">function</span><span class="params">(err)</span> {</span> <span class="keyword">if</span> (err) { res.writeHead(<span class="number">500</span>); <span class="keyword">return</span> res.end(<span class="string">"OH NO ERROR"</span>); } }); } <span class="keyword">if</span> (uri.pathname === <span class="string">"/SAML2/AssertionConsumer/POST"</span>) { <span class="keyword">return</span> saml2.Transport.Post.consume(req, <span class="function"><span class="keyword">function</span><span class="params">(err, body)</span> {</span> <span class="keyword">if</span> (err) { res.writeHead(<span class="number">500</span>); <span class="keyword">return</span> res.end(<span class="string">"Error reading assertion"</span>); } <span class="keyword">var</span> onVerified = <span class="function"><span class="keyword">function</span> <span class="title">onVerified</span><span class="params">(err, valid)</span> {</span> <span class="keyword">if</span> (err) { res.writeHead(<span class="number">500</span>); <span class="keyword">return</span> res.end(<span class="string">"Error verifying signature"</span>); } <span class="keyword">if</span> (!valid) { res.writeHead(<span class="number">403</span>); <span class="keyword">return</span> res.end(<span class="string">"uh oh, the saml response's signature was not valid!"</span>); } res.writeHead(<span class="number">200</span>, { <span class="string">"content-type"</span>: <span class="string">"application/json"</span>, }); res.end(JSON.stringify(body.samlResponse, <span class="literal">null</span>, <span class="number">2</span>)); }; <span class="keyword">if</span> (idp.certificate) { <span class="keyword">return</span> idp.verify(body.samlResponseXml, onVerified); } <span class="keyword">else</span> { <span class="keyword">return</span> onVerified(<span class="literal">null</span>, <span class="literal">true</span>); } }); } res.writeHead(<span class="number">404</span>); res.end(<span class="string">"not found!"</span>); }); server.listen(<span class="number">3000</span>, <span class="function"><span class="keyword">function</span><span class="params">()</span> {</span> console.log(<span class="string">""</span>); console.log(<span class="string">"Service provider example now listening!"</span>); console.log(<span class="string">""</span>); console.log(<span class="string">"Visit http://127.0.0.1:3000/ in your browser and watch the magic!"</span>); console.log(<span class="string">""</span>); console.log(<span class="string">"--------"</span>); console.log(<span class="string">""</span>); });</pre></div></div> </li> </ul> </div> </body> </html>