<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Scott Smith]]></title>
  <link href="http://scottksmith.com/atom.xml" rel="self"/>
  <link href="http://scottksmith.com/"/>
  <updated>2017-04-01T19:09:20-07:00</updated>
  <id>http://scottksmith.com/</id>
  <author>
    <name><![CDATA[Scott Smith]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Secure Node Apps Against OWASP Top 10 - Cross Site Request Forgery]]></title>
    <link href="http://scottksmith.com/blog/2015/06/29/secure-node-apps-against-owasp-top-10-cross-site-request-forgery/"/>
    <updated>2015-06-29T10:09:00-07:00</updated>
    <id>http://scottksmith.com/blog/2015/06/29/secure-node-apps-against-owasp-top-10-cross-site-request-forgery</id>
    <content type="html"><![CDATA[<p>Welcome to part 4 of the OWASP security series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2015/06/08/secure-node-apps-against-owasp-top-10-injection/">Injection</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/15/secure-node-apps-against-owasp-top-10-authentication-and-sessions/">Broken Authentication &amp; Session Management</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/22/secure-node-apps-against-owasp-top-10-cross-site-scripting/">Cross Site Scripting (XSS)</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/29/secure-node-apps-against-owasp-top-10-cross-site-request-forgery/">Cross Site Request Forgery (CSRF)</a></li>
<li>Using Components with Known Vulnerabilities (Coming soon)</li>
</ol>


<p>In this multipart series, we will explore some of the the <a href="https://www.owasp.org/index.php/Top_10_2013">OWASP top web application security flaws</a> including how they work and best practices to protect your application from them. The focus will be on Express web applications in Node, but the principles shown can be applied to any framework or environment.</p>

<p>This part will cover <a href="https://www.owasp.org/index.php/Top_10_2013-A8-Cross-Site_Request_Forgery_(CSRF%29">cross site request forgery (CSRF)</a>.</p>

<h3>Cross Site Request Forgery (CSRF)</h3>

<p>So what exactly is a cross site request forgery vulnerability?</p>

<p>A CSRF attack occurs when an attacker is able to create forged HTTP requests and trick the victim into making those requests via image tags, XSS, and many other ways. When the user makes these malicious requests and is authenticated with the application, the attack can be even more devastating. The attacker is able to get the user to perform state changing operations that the user is authorized to do in the application such as updating account details, making purchases, transferring money, and even deleting the account. Essentially, the attacker takes advantage of the website&#8217;s trust in the user.</p>

<p>We will go over a few different scenarios and show how to protect against them.</p>

<h3>Scenario 1: Changes allowed via GET requests</h3>

<p>This first scenario occurs when a website allows changes to be done via GET requests.</p>

<p><img src="http://scottksmith.com/images/csrf1.png" alt="CSRF Scenario 1" /></p>

<h4>Login</h4>

<p>The first two steps show the victim logging into their bank. This is important because the user must be logged in for the CSRF attack to work.</p>

<h4>GET /index.html</h4>

<p>The attacker has a page on a site they control and shares a link on social media. Our user clicks the link to see what it is and their browser makes a request to <code>/index.html</code> on the attacker&#8217;s site.</p>

<h4>HTTP/1.1 200 OK</h4>

<p>Requests to <code>/index.html</code> returns the following HTML content. If you look at the image tag, you will see it will make a request directly to the bank&#8217;s transfer page along with some query string parameters specifying an account to transfer an amount of money to.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">&quot;https://bank.com/transfer?to=12345&amp;dollars=1000000&quot;</span> <span class="na">width=</span><span class="s">&quot;0&quot;</span> <span class="na">height=</span><span class="s">&quot;0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>GET /transfer?to&#8230;</h4>

<p>This is where things get bad. Because the bank supports changes via GET requests, the user browsing to the attackers site will automatically make a GET request to https://bank.com/transfer?to=12345&amp;dollars=1000000. Because the user has already logged in, their session cookie is passed along in the request and the attack will succeed.</p>

<h4>Solution</h4>

<p>The solution here is very simple. Never allow changes to occur on GET requests. Only allow changes to be made when the HTTP method is POST, PUT, or DELETE.</p>

<h3>Scenario 2: Posting exploited data to sites</h3>

<p>We have now locked our applications down to no longer allow changes via GET requests. This next attack occurs by getting the user to automatically submit a malicious POST request to the web application.</p>

<p><img src="http://scottksmith.com/images/csrf2.png" alt="CSRF Scenario 2" /></p>

<h4>Login</h4>

<p>The first two steps show the victim logging into their bank.</p>

<h4>GET /index.html</h4>

<p>The attacker has a page on a site they control and shares a link on social media. Our user clicks the link to see what it is and their browser makes a request to <code>/index.html</code> on the attacker&#8217;s site.</p>

<h4>HTTP/1.1 200 OK</h4>

<p>Requests to <code>/index.html</code> returns the following HTML content. What is going on here is the attacker is creating a form that when submitted will POST to our transfer endpoint on our web application. The content then adds a script that will automatically trigger that POST.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;form</span> <span class="na">name=</span><span class="s">&quot;bad&quot;</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span> <span class="na">action=</span><span class="s">&quot;https://bank.com/transfer&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name=</span><span class="s">&quot;to&quot;</span> <span class="na">value=</span><span class="s">&quot;12345&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name=</span><span class="s">&quot;dollars&quot;</span> <span class="na">value=</span><span class="s">&quot;1000000&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/form&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;script&gt;</span><span class="nb">document</span><span class="p">.</span><span class="nx">bad</span><span class="p">.</span><span class="nx">submit</span><span class="p">()</span><span class="nt">&lt;/script&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>POST /transfer?to&#8230;</h4>

<p>This is where things get bad, again. Because the user is logged in and the attacker was able to get the user&#8217;s browser to automatically POST a malicious request to our web application, the user&#8217;s bank account will have been successfully hacked.</p>

<h4>Solution</h4>

<p>The solution here is to implement the synchronizer token pattern.</p>

<p>The following sample Express application shows how to implement this using the <code>csurf</code> npm package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">csrf</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;csurf&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">csrf</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">locals</span><span class="p">.</span><span class="nx">_csrf</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">csrfToken</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">next</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Add _csrf to rendered HTML forms as hidden field (see HTML below)</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;form</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span> <span class="na">action=</span><span class="s">&quot;transfer&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name=</span><span class="s">&quot;_csrf&quot;</span> <span class="na">value=</span><span class="s">&quot;_csrf&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;to&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;test&quot;</span> <span class="na">name=</span><span class="s">&quot;dollars&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/form&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>What this code does is makes it so that all POSTs made to our application MUST include a CSRF token or nonce. This token is set when the user makes a request to our page that contains the form and expects that same token when a POST is made. If the token is not there, the POST is not allowed. This will defeat the scenario we just went over because the attacker will not be able to generate a token that our application is aware of.</p>

<h3>Scenario 3: Bypassing CSRF protections</h3>

<p>Now that we do not make changes via GET requests as well as implementing CSRF protection via nonce tokens, we are still vulnerable to some attacks that can get around CSRF protection.</p>

<p><img src="http://scottksmith.com/images/csrf3.png" alt="CSRF Scenario 3" /></p>

<h4>Login</h4>

<p>The first two steps show the victim logging into their bank.</p>

<h4>GET /index.html</h4>

<p>The attacker has a page on a site they control and shares a link on social media. Our user clicks the link to see what it is and their browser makes a request to <code>/index.html</code> on the attacker&#8217;s site.</p>

<h4>HTTP/1.1 200 OK</h4>

<p>Requests to <code>/index.html</code> returns the following HTML content. What is going on here is the attacker is creating an iframe that loads up our page along with our form that includes the fields and the CSRF nonce token.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;iframe</span> <span class="na">src=</span><span class="s">&quot;https://bank.com/transfer?to=12345&amp;dollars=1000000&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>For the sake of this scenario, the resulting form that would be loaded will look like the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;form</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span><span class="nt">&gt;</span>
</span><span class='line'> <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;to&quot;</span> <span class="na">value=</span><span class="s">&quot;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'> <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;dollars&quot;</span> <span class="na">value=</span><span class="s">&quot;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'> <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name=</span><span class="s">&quot;csrf&quot;</span> <span class="na">value=</span><span class="s">&quot;a0d73b12&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/form&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And finally, here is our code on our server handling POSTs to the transfer endpoint.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;/transfer&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">isValid</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">csrfToken</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">to</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">to</span> <span class="o">||</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">to</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">dollars</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">dollars</span> <span class="o">||</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">dollars</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Transfer money</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>POST /transfer?to&#8230;</h4>

<p>This is where things get bad, yet again. Like before, our user is logged in. The content from our page including the form is now loaded within an attackers site. Through <a href="https://www.owasp.org/index.php/Clickjacking">clickjacking</a> techniques the attack could potentially get the user to submit the form.</p>

<h4>Solution 1</h4>

<p>Before we discuss the solution, we need to understand what is wrong with our current setup. Even if the page loads up our form, the user would have to manually enter a bank account along with money for the form submission to work, right? Well, not exactly. Because we are not explicitly setting the form action, the default URL that will be POSTed to will be the Url the page was loaded from. In our case this will be the Url the attacker entered which contains query string parameters for the account to send money to and the amount.</p>

<p>If you look at how we coded our handling of the POST, we are using parameters from either the query string or the POSTed data. In this example and attack, the query string parameters would get used and the attack would succeed.</p>

<p>The first solution to this problem is to always set the form action. Instead of leaving it blank, you should always set it to the endpoint you want to submit to.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;form</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span> <span class="na">action=</span><span class="s">&quot;https://bank.com/transfer&quot;</span><span class="nt">&gt;</span>
</span><span class='line'> <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;to&quot;</span> <span class="na">value=</span><span class="s">&quot;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'> <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;dollars&quot;</span> <span class="na">value=</span><span class="s">&quot;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'> <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;hidden&quot;</span> <span class="na">name=</span><span class="s">&quot;csrf&quot;</span> <span class="na">value=</span><span class="s">&quot;a0d73b12&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/form&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will make it so the attacker cannot get the user to submit the form to an endpoint along with query string parameters.</p>

<h4>Solution 2</h4>

<p>The second solution goes along with the first. This one is to never use query string parameters for user input. This will force our code to only use parameters sent via the POSTed form data.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;/transfer&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">isValid</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">csrfToken</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">to</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">to</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">dollars</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">dollars</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//Transfer money</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Solution 3</h4>

<p>The final solution is one that is good to implement on all your applications in order to control how your application behaves and to help avoid this type of attack. The solution is to use the X-Frame-Options header.</p>

<p>By taking advantage of this header, you can tell web browsers (that support it) to never allow your application within frames. With this in place, the attacker will not be able to load your page within theirs.</p>

<p>Here is an example Express application using the helmet npm package to do this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span>  <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">xframe</span><span class="p">(</span><span class="s1">&#39;deny&#39;</span><span class="p">));</span>       <span class="c1">//never allow in frames</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code will send back a response header that will tell the browser to never allow it to be within a frame. Here is what the header looks like.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">X-Frame-Options: DENY</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Wrap up</h3>

<p>I hope that by learning how CSRF attacks are performed you have a better understanding of how to protect your applications. I have shown a few ways in which you can protect yourself but it is important to learn more on this subject using the links I shared above. Also, these solutions are not exclusive. You should implement many layers of protection for your application.</p>

<p>I have a lot more tutorials coming so be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Secure Node Apps Against OWASP Top 10 - Cross Site Scripting]]></title>
    <link href="http://scottksmith.com/blog/2015/06/22/secure-node-apps-against-owasp-top-10-cross-site-scripting/"/>
    <updated>2015-06-22T07:44:00-07:00</updated>
    <id>http://scottksmith.com/blog/2015/06/22/secure-node-apps-against-owasp-top-10-cross-site-scripting</id>
    <content type="html"><![CDATA[<p>Welcome to part 3 of the OWASP security series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2015/06/08/secure-node-apps-against-owasp-top-10-injection/">Injection</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/15/secure-node-apps-against-owasp-top-10-authentication-and-sessions/">Broken Authentication &amp; Session Management</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/22/secure-node-apps-against-owasp-top-10-cross-site-scripting/">Cross Site Scripting (XSS)</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/29/secure-node-apps-against-owasp-top-10-cross-site-request-forgery/">Cross Site Request Forgery (CSRF)</a></li>
<li>Using Components with Known Vulnerabilities (Coming soon)</li>
</ol>


<p>In this multipart series, we will explore some of the the <a href="https://www.owasp.org/index.php/Top_10_2013">OWASP top web application security flaws</a> including how they work and best practices to protect your application from them. The focus will be on Express web applications in Node, but the principles shown can be applied to any framework or environment.</p>

<p>This part will cover <a href="https://www.owasp.org/index.php/Top_10_2013-A3-Cross-Site_Scripting_(XSS%29">cross site scripting (XSS)</a>.</p>

<h3>Cross Site Scripting (XSS)</h3>

<p>So what exactly is a cross site scripting vulnerability?</p>

<p>XSS, the most prevalent web application security flaw, occurs when an application includes user supplied data in a page sent to the browser without properly validating, escaping, or sanitizing that content.</p>

<p>An XSS attack occurs when an attacker sends text-based scripts that exploit the interpreter in the browser. Essentially, the attacker takes advantage of the user&#8217;s trust in the website. By this, I mean the end user viewing your web application trusts the content you are sending back. Because of this implicit trust, an attacker can exploit it by having your web application return malicious content.</p>

<p>There are two main types of XSS attacks:</p>

<ol>
<li>Non-persistent</li>
<li>Persistent</li>
</ol>


<h3>Non-persistent</h3>

<p>Non-persistent, also referred to as reflected, are attacks where injected scripts are sent to a user&#8217;s browser via the user&#8217;s own request to the web application. These types of attacks are done by tricking the victim into initiating the attack via email, some other website, social media, etc. The result is the user clicks a malicious link, submits a form, or makes a request to a malicious site. In doing so, the user&#8217;s browser is used as the medium to send the injected code to the web application through the request which is then reflected back to user in the response. The browser then executes the injected code because it came from the web application which it trusts.</p>

<p>The following diagram shows how this type of attack is done. We will go over it step by step.</p>

<p><img src="http://scottksmith.com/images/xss1.png" alt="XSS Non-persistent" /></p>

<p>In this example, Site (our web application) implements a search function at the endpoint <code>/search?q=searchTerm</code>. An attacker has found that when they do a normal search on the site, the results page shows the search term along with the results. After some testing, the attacker finds that the site is not escaping or sanitizing the search term before showing it in the results page. The attacker has just found an XSS vulnerability.</p>

<p>Here is one way the attacker could exploit this vulnerability.</p>

<h4>GET /index.html</h4>

<p>The attacker has a page on a site they control and shares a link on social media. Our user clicks the link to see what it is and their browser makes a request to <code>/index.html</code> on the attacker&#8217;s site.</p>

<h4>HTTP/1.1 200 OK</h4>

<p>Requests to <code>/index.html</code> returns the following HTML content. If you look at the anchor tag, you will see it links directly to the search page on our web application and supplies JavaScript as the search term.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;https://site.com/search?q=&lt;script&gt;alert(&#39;hacked&#39;)&lt;/script&gt;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    Click Here
</span><span class='line'>  <span class="nt">&lt;/a&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>GET /search?q=&#8230;</h4>

<p>If the user clicks the link, and many will, their browser will make a request to our search page along with the malicious JavaScript in the search term.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">https://site.com/search?q=&lt;script&gt;alert(&#39;hacked&#39;)&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>HTTP/1.1 200 OK</h4>

<p>Because our site is not properly escaping the search term being supplied by the user, we will return a response to the user that includes the injected JavaScript. In this example, it would just create an alert, but the attacker could do anything including injecting script tags that fetch other JavaScript.</p>

<p>Here is the response in a normal case</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;div&gt;</span>
</span><span class='line'>    You searched for: Puppies
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is the response in our exploited case</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;div&gt;</span>
</span><span class='line'>    You searched for: <span class="nt">&lt;script&gt;</span><span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;hacked&#39;</span><span class="p">)</span><span class="nt">&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Send valuable data</h4>

<p>The end user&#8217;s browser will now execute the script that was injected into the page. The attacker could send valuable information embedded on the page, include other scripts to further the exploit, and more.</p>

<p>In this example, the attacker setup a page that the user had to click a link on. This attack could be done easier by simply returning a 302 response with the Location header set to the search page on our web application. This takes out the step of the user needing to click a link and makes the attack more probable. The user&#8217;s browser would get redirected to the exploited link and the attack would occur.</p>

<h3>Persistent</h3>

<p>Persistent, also referred to as stored, are attacks where the injected script is permanently stored on the target web application&#8217;s database. Victims are then tricked into clicking a link to the web application that returns back the injected script in the response after retrieving it from the database or persistent storage.</p>

<p>The following diagram shows how this type of attack is done. We will go over it step by step.</p>

<p><img src="http://scottksmith.com/images/xss2.png" alt="XSS Persistent" /></p>

<p>In this example, Site (our web application) allows users to POST comments at the endpoint <code>/comment</code>. An attacker has found that when they POST comments on the site, the posted data is not escaped or sanitized before storing it and/or showing it. The attacker has just found an XSS vulnerability.</p>

<p>Here is one way the attacker could exploit this vulnerability.</p>

<h4>POST /comment</h4>

<p>The attacker knows they can POST comments to the site that allow scripts to be injected. The attacker will POST an exploited comment to the site with the following content.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script&gt;</span><span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;hacked&#39;</span><span class="p">)</span><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This comment is now persisted because the content is stored in the database. Anytime a user views the comment, the injected script will be executed.</p>

<h4>GET /comment?id=1</h4>

<p>A user is browsing the site and views the exploited comment. They could get to this comment by just being on the site or could be directly to it via email, social share, etc.</p>

<h4>HTTP/1.1 200 OK</h4>

<p>Because our site is not properly escaping or sanitizing input or output, the resulting response to the user will include the injected script.</p>

<h4>Send valuable data</h4>

<p>The injected script will be executed on the end user&#8217;s browser which allows the attacker to get a hold of valuable information embedded on the page, include other scripts to further the exploit, and more.</p>

<h3>Solution 1</h3>

<p>The first solution is to always validate, escape, or sanitize user input. As a rule, all user input should be treated as malicious. If you build your application in a way that distrusts user input, you will end up with a more secure system.</p>

<p>This can be done by either sanitizing all user input as it enters the system or as it leaves. The following code is one way to do this in an Express application. What we are doing here is setting up middleware that will process all posted data by sanitizing it. I like this pattern because it avoids the case where newly added forms could be missed if you are sanitizing per input.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">bodyParser</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;body-parser&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">validator</span>  <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express-validator&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">urlencoded</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">validator</span><span class="p">());</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">item</span> <span class="k">in</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">req</span><span class="p">.</span><span class="nx">sanitize</span><span class="p">(</span><span class="nx">item</span><span class="p">).</span><span class="nx">escape</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nx">next</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>With this code in place, our previous exploit examples of injecting JavaScript would turn</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script&gt;</span><span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;hacked&#39;</span><span class="p">)</span><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>into the following</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="ni">&amp;gt;</span>script<span class="ni">&amp;lt;</span>alert(<span class="ni">&amp;#x27;</span>hacked<span class="ni">&amp;#x27;</span>)<span class="ni">&amp;gt;</span>/script<span class="ni">&amp;lt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>One issue with sanitizing user input as it enters the system is if someone is able to get data into your database or persistent storage through another means. If this happens, your application can still be vulnerable to XSS attacks. In this case, you will want to consider sanitizing data as it leaves your application.</p>

<h3>Solution 2</h3>

<p>The second solution is to tell the web browser to allow content only from trusted sources.</p>

<p>This can be done by taking advantage of a powerful response header called Content Security Policy or CSP. CSP is a response header that tells the browser the domains it should consider as valid sources of content.</p>

<p>This can be used in two ways for our applications. First, we can tell the browser which domains it is allowed to trust and run JavaScript from. Second, we can tell the browser to not allow any in-line script. These two methods can protect many of our users (the ones with browsers that support CSP) from XSS attacks. If the attacker cannot get the browser to load or execute the injected JavaScript, then the attack is stopped.</p>

<p>The following code shows an example Express application using the <code>helmet</code> package to implement CSP.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span>  <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">csp</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">defaultSrc</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;&#39;self&#39;&quot;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">scriptSrc</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.google-analytics.com&#39;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">styleSrc</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;&#39;unsafe-inline&#39;&quot;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">imgSrc</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.google-analytics.com&#39;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">connectSrc</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;&#39;none&#39;&quot;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">fontSrc</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>  <span class="nx">objectSrc</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>  <span class="nx">mediaSrc</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>  <span class="nx">frameSrc</span><span class="o">:</span> <span class="p">[]</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example, we are telling the browser to only allow scripts from our own domain as well as *.google-analytics.com.</p>

<p>Here is what the response headers look like with newlines added for readability.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">Content-Security-Policy: </span>
</span><span class='line'><span class="err">  default-src &#39;self&#39;;</span>
</span><span class='line'><span class="err">  script-src *.google-analytics.com;</span>
</span><span class='line'><span class="err">  object-src ;</span>
</span><span class='line'><span class="err">  img-src *.google-analytics.com;</span>
</span><span class='line'><span class="err">  media-src ;</span>
</span><span class='line'><span class="err">  frame-src ;</span>
</span><span class='line'><span class="err">  font-src ;</span>
</span><span class='line'><span class="err">  connect-src &#39;none&#39;;</span>
</span><span class='line'><span class="err">  style-src &#39;unsafe-inline&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Solution 3</h3>

<p>The final solution is to do a deep analysis of your application and understand all the ways in which you could/should protect yourself. This <a href="https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting">cheat sheet</a>_Prevention_Cheat_Sheet) provided by OWASP does a great job of discussing all the rules you should follow.</p>

<h3>Wrap up</h3>

<p>I hope that by learning how XSS attacks are performed you have a better understanding of how to protect your applications. I have shown a few ways in which you can protect yourself but it is important to learn more on this subject using the links I shared above. Also, these solutions are not exclusive. You should implement many layers of protection for your application.</p>

<p>I have a lot more tutorials coming so be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Secure Node Apps Against OWASP Top 10 - Authentication &amp; Sessions]]></title>
    <link href="http://scottksmith.com/blog/2015/06/15/secure-node-apps-against-owasp-top-10-authentication-and-sessions/"/>
    <updated>2015-06-15T10:42:00-07:00</updated>
    <id>http://scottksmith.com/blog/2015/06/15/secure-node-apps-against-owasp-top-10-authentication-and-sessions</id>
    <content type="html"><![CDATA[<p>Welcome to part 2 of the OWASP security series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2015/06/08/secure-node-apps-against-owasp-top-10-injection/">Injection</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/15/secure-node-apps-against-owasp-top-10-authentication-and-sessions/">Broken Authentication &amp; Session Management</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/22/secure-node-apps-against-owasp-top-10-cross-site-scripting/">Cross Site Scripting (XSS)</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/29/secure-node-apps-against-owasp-top-10-cross-site-request-forgery/">Cross Site Request Forgery (CSRF)</a></li>
<li>Using Components with Known Vulnerabilities (Coming soon)</li>
</ol>


<p>In this multipart series, we will explore some of the the <a href="https://www.owasp.org/index.php/Top_10_2013">OWASP top web application security flaws</a> including how they work and best practices to protect your application from them. The focus will be on Express web applications in Node, but the principles shown can be applied to any framework or environment.</p>

<p>This part will cover <a href="https://www.owasp.org/index.php/Top_10_2013-A2-Broken_Authentication_and_Session_Management">broken authentication and session management</a>.</p>

<h3>Broken Authentication and Session Management</h3>

<p>So what exactly is a broken authentication or session management vulnerability? OWASP defines it as follows:</p>

<p>&#8220;Attacker uses leaks or flaws in the authentication or session management functions (e.g., exposed accounts, passwords, session IDs) to impersonate users.&#8221;</p>

<p>&#8220;An attacker can be an anonymous external attacker or a user with their own account who may attempt to steal accounts from others.&#8221;</p>

<p>&#8220;Such flaws may allow some or even all accounts to be attacked. Once successful, the attacker can do anything the victim could do. Privileged accounts are frequently targeted.&#8221;</p>

<p>The following scenarios will highlight some of the ways in which this type of vulnerability can be exploited and best practices to protect against them. Like all things security related, this list should not be considered the only ways in which you could be vulnerable.</p>

<h3>Scenario 1: Plain text passwords</h3>

<p>Surprisingly, there are still many sites that store user passwords in plain text. This becomes obvious when a site gets hacked and all their user&#8217;s information along with passwords are exposed.</p>

<p>This is bad for obvious reasons. Once an attacker knows a user&#8217;s password, they can now log in as that user and do whatever they want.</p>

<p>You should always build your applications assuming you will get hacked or data will get leaked. By taking this approach, you will be much more likely to take precautions to secure sensitive information. User passwords are one of the most important pieces of data to secure.</p>

<p>The best way to secure user passwords is with a strong hash. Encrypting a password is better than plain text but still not as secure as a hash. With encryption, all the attacker needs do is get a hold of the keys and they can determine the password.</p>

<p>One way to hash and verify passwords is with the following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">bcrypt</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;bcrypt-nodejs&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">hashPassword</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">password</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">bcrypt</span><span class="p">.</span><span class="nx">genSalt</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">salt</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">bcrypt</span><span class="p">.</span><span class="nx">hash</span><span class="p">(</span><span class="nx">password</span><span class="p">,</span> <span class="nx">salt</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">hash</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">hash</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">verifyPassword</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">password</span><span class="p">,</span> <span class="nx">hash</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">bcrypt</span><span class="p">.</span><span class="nx">compare</span><span class="p">(</span><span class="nx">password</span><span class="p">,</span> <span class="nx">hash</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">isMatch</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">isMatch</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Just because your user&#8217;s passwords are hashed doesn&#8217;t mean you shouldn&#8217;t worry about locking down your application. Even with hashed passwords, an attacker can eventually determine the passwords of some of your user&#8217;s accounts with enough time.</p>

<h3>Scenario 2: Session IDs in the URL</h3>

<p>Session IDs are unique numbers web applications assign to a user for the duration of the user&#8217;s visit. It is used so the web server knows the identify of the user making the request without the user having to log in again.</p>

<p>Because the session ID can be used to identify a user as well as grant permissions, protecting it is very important. By passing the session ID via the URL, you are exposing your application and users to a hacker. Imagine the following request being made to your bank:</p>

<p><strong>https://bank.com/account?sessionid=1234567</strong></p>

<p>Passing session IDs like this can be bad for the following reasons:</p>

<ul>
<li>Sharing of link grants others full access</li>
<li>Stored on cache servers</li>
<li>Stored in browser history</li>
<li>Leaked through the Referer header</li>
<li>Leaked through logs not properly protected</li>
<li>Much more visible and thus more dangerous</li>
</ul>


<p>The solution to this problem is pretty simple. Pass session IDs via cookies and not the URL. The following code is an example Express application that uses cookies for the session ID.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express-session&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">session</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">secret</span><span class="o">:</span> <span class="s1">&#39;our super secret session secret&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">cookie</span><span class="o">:</span> <span class="p">{</span> <span class="nx">maxAge</span><span class="o">:</span> <span class="mi">3600000</span> <span class="p">}</span> <span class="c1">// 2 hours in milliseconds</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Scenario 3: Site accessed over HTTP</h3>

<p>The next scenario where vulnerabilities can occur is if your site is accessed over HTTP.</p>

<p>This can be bad if you are not taking the necessary precautions to protect your users. Imagine if your user is on a public unencrypted wifi network. If your site is over HTTP, it is very easy for someone else on that wifi network to monitor and obtain your session ids. Even if the user is on a secure network, there is no guarantee that a third party somewhere along the route to the web application is not monitoring traffic.</p>

<h4>Solution 1</h4>

<p>The first and most obvious solution here is to run your site over HTTPS. If you have user accounts, users logging in, or session sate you should not run your site over HTTP. It is very affordable and even free solutions exist. By running over HTTPS, you will reduce a significant attack vector within your application.</p>

<h4>Solution 2</h4>

<p>The second solution is to not allow cookies to be sent over HTTP. Even if your site runs over HTTPS, you will very likely still be listening for HTTP requests in order to redirect them to the HTTPS endpoint. Because of this, unless you take measures, a user can still send their session id via the cookie over an unsecured channel.</p>

<p>In order to stop this, you need to use the <code>secure</code> flag for your cookies. This flag, when set in the response that sets the cookie, will tell the browser to only send this cookie over an HTTPS request.</p>

<p>The following Express application from previous examples is updated to show how to do this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express-session&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;trust proxy&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">session</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">secret</span><span class="o">:</span> <span class="s1">&#39;our super secret session secret&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">cookie</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">maxAge</span><span class="o">:</span> <span class="mi">3600000</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">secure</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is an example of what the header looks like with both the <code>secure</code> and <code>httpOnly</code> flags set.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">Set-Cookie: connect.sid=fjdskfjdsksdfjksa; Domain=favatron.com; Path=/; Expires=Sun, 28 Jun 2015 02:12:41 GMT; Secure</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Solution 3</h4>

<p>The third solution is to not allow client side scripts access to your cookies. By default, client side JavaScript is able to read your cookies. This means that any third party JavaScript you are including has the potential to read your cookies and use the session id for nefarious purposes.</p>

<p>In order to stop this, you need to use the <code>httpOnly</code> flag for your cookies. This flag, when set in the response that sets the cookie, will tell the browser to not allow any client side JavaScript access to it. The cookie is only sent over requests.</p>

<p>The following Express application from previous examples is updated to show how to do this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express-session&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">session</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">secret</span><span class="o">:</span> <span class="s1">&#39;our super secret session secret&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">cookie</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">maxAge</span><span class="o">:</span> <span class="mi">3600000</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">secure</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">httpOnly</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is an example of what the header looks like with both the <code>secure</code> and <code>httpOnly</code> flags set.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">Set-Cookie: connect.sid=fjdskfjdsksdfjksa; Domain=favatron.com; Path=/; Expires=Sun, 28 Jun 2015 02:12:41 GMT; HttpOnly; Secure</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Solution 4</h4>

<p>The fourth solution is to tell the browser to never make HTTP requests again. There is a great response header you can send back on all responses that tells the browser to only make requests over HTTPS for a certain amount of time. This response is called HTTP Strict Transport Security (HSTS).</p>

<p>This is a great feature, because it negates the problem where users may still make requests over HTTP to your site. Then at the most, users would make one request over HTTP. From that point forward, they would only make requests over HTTPS.</p>

<p>The following Express application from previous examples is updated to show how to do this using the <code>helmet</code> package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express-session&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span>  <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">hsts</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">maxAge</span><span class="o">:</span> <span class="mi">7776000000</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">includeSubdomains</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;trust proxy&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">session</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">secret</span><span class="o">:</span> <span class="s1">&#39;our super secret session secret&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">cookie</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">maxAge</span><span class="o">:</span> <span class="mi">3600000</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">secure</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">httpOnly</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is what the response header would look like.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">Strict-Transport-Security: max-age=7776000; includeSubDomains</span>
</span></code></pre></td></tr></table></div></figure>


<p>Along with using the response headers to control this, there is a registry where you can add your domain and have it automatically added to preload lists of Chrome, Firefox, Safari, and a future version of IE. This way, even that initial request over HTTP could be avoided. You can find the form <a href="https://hstspreload.appspot.com/">here</a>.</p>

<h3>Wrap up</h3>

<p>There are many more ways in which you can create broken authentication and session management. Hopefully this article has given you some insight into areas of your application to pay attention to.</p>

<p>I have a lot more tutorials coming so be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Secure Node Apps Against OWASP Top 10 - Injection]]></title>
    <link href="http://scottksmith.com/blog/2015/06/08/secure-node-apps-against-owasp-top-10-injection/"/>
    <updated>2015-06-08T12:06:00-07:00</updated>
    <id>http://scottksmith.com/blog/2015/06/08/secure-node-apps-against-owasp-top-10-injection</id>
    <content type="html"><![CDATA[<p>Welcome to part 1 of the OWASP security series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2015/06/08/secure-node-apps-against-owasp-top-10-injection/">Injection</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/15/secure-node-apps-against-owasp-top-10-authentication-and-sessions/">Broken Authentication &amp; Session Management</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/22/secure-node-apps-against-owasp-top-10-cross-site-scripting/">Cross Site Scripting (XSS)</a></li>
<li><a href="http://scottksmith.com/blog/2015/06/29/secure-node-apps-against-owasp-top-10-cross-site-request-forgery/">Cross Site Request Forgery (CSRF)</a></li>
<li>Using Components with Known Vulnerabilities (Coming soon)</li>
</ol>


<p>In this multipart series, we will explore some of the the <a href="https://www.owasp.org/index.php/Top_10_2013">OWASP top web application security flaws</a> including how they work and best practices to protect your application from them. The focus will be on Express web applications in Node, but the principles shown can be applied to any framework or environment.</p>

<p>This part of the series will cover <a href="https://www.owasp.org/index.php/Top_10_2013-A1-Injection">Injection</a>.</p>

<h3>Injection</h3>

<p>So what exactly is an Injection attack? An Injection attack occurs when an attacker sends text-based attacks that exploit the syntax of the targeted interpreter.</p>

<p>An attacker can be anyone capable of sending untrusted data to the system such as external users, internal users, administrators, etc.</p>

<p>Injection attacks can be very bad for an application. They can result in data loss, data corruption, data access, denial of access, and even complete takeover.</p>

<h3>SQL Injection</h3>

<p>When you hear about Injection attacks, the one you might think of first is SQL injection. SQL injection has been around for almost 20 years and is still a big issue for many web applications. A <a href="http://www.imperva.com/docs/HII_Web_Application_Attack_Report_Ed4.pdf">study</a> done in 2012 by Imperva observed that average web applications get at least 4 SQL injection attacks per month.</p>

<p>Most commonly known as an attack vector for web applications, SQL injection can also be used to attack any application using SQL databases. Like Injection attacks in general, SQL injection is done by injecting code (via text) into data-driven applications. The goal of these attacks is to inject SQL statements and have them executed for the purpose of dumping the database contents, deleting data, and more.</p>

<p>Some of the systems that can be affected by this attack are SQL Server, PostgreSQL, MySQL, and any SQL based database.</p>

<p>Below you will see an example Express application using a MySQL database that is vulnerable to SQL injection.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">bodyParser</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;body-parser&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mysql</span>      <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mysql&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">connection</span> <span class="o">=</span> <span class="nx">mysql</span><span class="p">.</span><span class="nx">createConnection</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">urlencoded</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;/login&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">user</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">pass</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">pass</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">sql</span>  <span class="o">=</span> <span class="s2">&quot;SELECT * FROM users WHERE user = &#39;&quot;</span> <span class="o">+</span> <span class="nx">user</span> <span class="o">+</span> <span class="s2">&quot;&#39; AND pass = &#39;&quot;</span> <span class="o">+</span> <span class="nx">pass</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">connection</span><span class="p">.</span><span class="nx">query</span><span class="p">(</span><span class="nx">sql</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">results</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The problem with this code is that we are building our SQL statement using user input. You can see this on lines 11 to 13. We are reading in user supplied input for the <code>user</code> and <code>pass</code> variables. These are then used via string concatentation to build our SQL statement.</p>

<p>So why is this bad? Let me show you an example of how bad this is. Imagine someone making the following HTTP request to the <code>/login</code> endpoint.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>POST /login HTTP/1.1
</span><span class='line'>Host: example.com
</span><span class='line'>Content-Type: application/x-www-form-urlencoded
</span><span class='line'>
</span><span class='line'>user=admin&#39;--&amp;pass=whatever
</span></code></pre></td></tr></table></div></figure>


<p>The resulting SQL statement would look like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">users</span> <span class="k">WHERE</span> <span class="k">user</span> <span class="o">=</span> <span class="s1">&#39;admin&#39;</span><span class="c1">--&#39; AND pass = &#39;whatever&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yeah, that is very bad. Assuming there is an account named admin, this attacker would now have access and permissions that the admin account has. But this is only a simple example. The attacker could do a multitude of things given this vulnerability.</p>

<h4>Solution #1: Escape user input</h4>

<p>In this example, we are using the <code>mysql</code> npm package. It offers functionality to properly escape user input which we can use to lock down our application. Many other libraries out there offer this type of functionality or you can find libraries solely for escaping user input. Here is our previous example now escaping user input.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">bodyParser</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;body-parser&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mysql</span>      <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mysql&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">connection</span> <span class="o">=</span> <span class="nx">mysql</span><span class="p">.</span><span class="nx">createConnection</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">urlencoded</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;/login&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">connection</span><span class="p">.</span><span class="nx">escape</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">user</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">pass</span> <span class="o">=</span> <span class="nx">connection</span><span class="p">.</span><span class="nx">escape</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">pass</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">sql</span>  <span class="o">=</span> <span class="s2">&quot;SELECT * FROM users WHERE user = &#39;&quot;</span> <span class="o">+</span> <span class="nx">user</span> <span class="o">+</span> <span class="s2">&quot;&#39; AND pass = &#39;&quot;</span> <span class="o">+</span> <span class="nx">pass</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">connection</span><span class="p">.</span><span class="nx">query</span><span class="p">(</span><span class="nx">sql</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">results</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, when someone sends an HTTP request like our previous example, the resulting SQL statement will look like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">users</span> <span class="k">WHERE</span> <span class="k">user</span> <span class="o">=</span> <span class="s1">&#39;admin&#39;&#39;--&#39;</span> <span class="k">AND</span> <span class="n">pass</span> <span class="o">=</span> <span class="s1">&#39;whatever&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can see that the resulting SQL statement no longer has the exploit in it.</p>

<p>While escaping user input is better than not, it is still not full proof. Escaping algorithms can have bugs, not cover all cases, or miss newly found exploits.</p>

<h4>Solution #2: Parameterized SQL queries</h4>

<p>Parameterize SQL queries is an even better way to secure your application. Instead of building a SQL statement using concatenation, we let a function replace the parameters within the statement and perform sanitation. Here is what our example would look like using this method. Please note this is a bit pseudo code but helps get the point across.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">bodyParser</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;body-parser&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">db</span>         <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;db&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">urlencoded</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;/login&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">user</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">pass</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">pass</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">sql</span>  <span class="o">=</span> <span class="s2">&quot;SELECT * FROM users WHERE user = $1 AND pass = $2&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">db</span><span class="p">.</span><span class="nx">query</span><span class="p">(</span><span class="nx">sql</span><span class="p">,</span> <span class="p">[</span><span class="nx">user</span><span class="p">,</span> <span class="nx">pass</span><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">results</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>What happens here is <code>$1</code> and <code>$2</code> get replaced with <code>user</code> and <code>pass</code> when we make the call to <code>db.query</code>. With our previous example, this is what the SQL statement would look like.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">users</span> <span class="k">WHERE</span> <span class="k">user</span> <span class="o">=</span> <span class="s1">&#39;admin&#39;&#39;--&#39;</span> <span class="k">AND</span> <span class="n">pass</span> <span class="o">=</span> <span class="s1">&#39;whatever&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Node Injection</h3>

<p>SQL is not the only way in which an injection attack can occur. Node can also be an attack vector. This can be done by getting it to execute JavaScript submitted as user input.</p>

<p>Attacks are done by taking advantage of applications that use <code>eval()</code> with user input. The following code shows an Express application vulnerable to this type of attack.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">bodyParser</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;body-parser&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">urlencoded</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;/run&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nb">eval</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">cmd</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>If someone were to make an HTTP request like the following, things would be bad in the application. It would be stuck in an infinite loop outputting to the console.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>POST /run HTTP/1.1
</span><span class='line'>Host: example.com
</span><span class='line'>Content-Type: application/x-www-form-urlencoded
</span><span class='line'>
</span><span class='line'>cmd=while(1){console.log(&quot;HACKED&quot;)}
</span></code></pre></td></tr></table></div></figure>


<p>This is a more benign exploit example but if this hole existed in an application, an attacker could execute anything they want.</p>

<p>The solution here is pretty simple. Never use <code>eval()</code> with user input. If you have to, be aware of the risks and attempt to mitigate them as much as possible.</p>

<h3>MongoDB Injection</h3>

<p>Another type of injection attack you need to be aware of is when working with MongoDB. These attacks usually take advantage of query selectors or the fact that they do not get explicitly set. The following Express application currently has a vulnerability to this type of attack.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">bodyParser</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;body-parser&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">urlencoded</span><span class="p">());</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">json</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;/login&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">user</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">pass</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">pass</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">db</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span><span class="nx">user</span><span class="o">:</span> <span class="nx">user</span><span class="p">,</span> <span class="nx">pass</span><span class="o">:</span> <span class="nx">pass</span><span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The exploit occurs because of the couple things. First, we are allowing JSON data to be posted to our application. Second, we are not specifying the query selectors to use (line 13). If an attacker were to make the following HTTP request to our application, a successful attack would occur.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='text'><span class='line'>POST /login HTTP/1.1
</span><span class='line'>Host: example.com
</span><span class='line'>Content-Type: application/json
</span><span class='line'>
</span><span class='line'>{
</span><span class='line'>    &quot;user&quot;: {&quot;$gt&quot;: &quot;&quot;},
</span><span class='line'>    &quot;pass&quot;: {&quot;$gt&quot;: &quot;&quot;}
</span><span class='line'>}
</span></code></pre></td></tr></table></div></figure>


<p>What happens here is the attacker is passing JSON objects for the <code>user</code> and <code>pass</code> parameters. When those are passed in to the <code>db.user.find()</code> call, the following occurs.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">db</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span><span class="nx">user</span><span class="o">:</span> <span class="p">{</span> <span class="s1">&#39;$gt&#39;</span><span class="o">:</span> <span class="s1">&#39;&#39;</span> <span class="p">},</span> <span class="nx">pass</span><span class="o">:</span> <span class="p">{</span> <span class="s1">&#39;$gt&#39;</span><span class="o">:</span> <span class="s1">&#39;&#39;</span> <span class="p">}});</span>
</span></code></pre></td></tr></table></div></figure>


<p>When this executes, we will find all users with <code>user</code> greater than &#8221; and <code>pass</code> greater than &#8221;. This will return all users within the user table. This happened because we are not explicitly setting the query selector so the attacker was able to specify one themself.</p>

<p>The solution to this exploit is simple. You need to explicity set the query selector. Here is our previous code updated to fix this issue. See line 13 for the changes.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">bodyParser</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;body-parser&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">urlencoded</span><span class="p">());</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">json</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">&#39;/login&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">user</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">pass</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">pass</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">db</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span><span class="nx">user</span><span class="o">:</span> <span class="p">{</span> <span class="nx">$in</span><span class="o">:</span> <span class="p">[</span><span class="nx">user</span><span class="p">]</span> <span class="p">},</span> <span class="nx">pass</span><span class="o">:</span> <span class="p">{</span> <span class="nx">$in</span><span class="o">:</span> <span class="p">[</span><span class="nx">pass</span><span class="p">]</span> <span class="p">}});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is what the result is now if someone were to make the same exploit HTTP request.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">db</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span><span class="nx">user</span><span class="o">:</span> <span class="p">{</span> <span class="nx">$in</span><span class="o">:</span> <span class="p">[{</span> <span class="s1">&#39;$gt&#39;</span><span class="o">:</span> <span class="s1">&#39;&#39;</span> <span class="p">}]</span> <span class="p">},</span> <span class="nx">pass</span><span class="o">:</span> <span class="p">{</span> <span class="nx">$in</span><span class="o">:</span> <span class="p">[{</span> <span class="s1">&#39;$gt&#39;</span><span class="o">:</span> <span class="s1">&#39;&#39;</span> <span class="p">}]</span> <span class="p">}});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, all users will not be returned for this attack and our code works as expected.</p>

<h3>Wrap up</h3>

<p>Injection attacks are one the most prevalent attacks out there, easiest to exploit, and can have a severe impact. If you can take one thing away from this article is to never trust user input. It is the trust in the input that allows these attacks to occur.</p>

<p>I have a lot more tutorials coming so be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Twitatron: Building a production web app with Node - User Accounts]]></title>
    <link href="http://scottksmith.com/blog/2015/05/26/twitatron-building-a-production-web-app-with-node-user-accounts/"/>
    <updated>2015-05-26T07:55:00-07:00</updated>
    <id>http://scottksmith.com/blog/2015/05/26/twitatron-building-a-production-web-app-with-node-user-accounts</id>
    <content type="html"><![CDATA[<p>Welcome to part 3 of the Twitaron series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2014/10/05/twitatron-building-a-production-web-app-with-node/">Getting started</a></li>
<li><a href="http://scottksmith.com/blog/2015/03/23/twitatron-building-a-production-web-app-with-node-views-and-controllers/">Views &amp; Controllers</a></li>
<li><a href="http://scottksmith.com/blog/2015/05/26/twitatron-building-a-production-web-app-with-node-user-accounts/">User Accounts</a></li>
<li>Under development&#8230;</li>
</ol>


<p>In our <a href="http://scottksmith.com/blog/2015/03/23/twitatron-building-a-production-web-app-with-node-views-and-controllers/">previous article</a> we leared how to add views, layouts, partials, controllers, and more.</p>

<p>In this installment of the Twitatron series, we will be diving into how to implement user accounts. By the end of this article you will have learned how to connect to MongoDB, used Mongoose for object modeling, implemented Passport for user authentication, allow users to login with their Twitter account, and have full support for user accounts.</p>

<h3>Secrets</h3>

<p>Before we go further into setting up support for logging in with Twitter, we need to add a way to easily develop locally and run in production. There are going to be settings that are different locally versus production and we don&#8217;t want these production values in our source code. There are many ways to handle this, but one way I like is to use a secrets module.</p>

<p>If you don&#8217;t already have a <code>config</code> directory in the root of your application, create one now. Inside this directory, create a new filed named <code>secrets.js</code>. Update this file to contain the following. We will be using many of these items in this and future tutorials.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">db</span><span class="o">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">MONGODB</span> <span class="o">||</span> <span class="s1">&#39;mongodb://localhost:27017/twitatron&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">cryptos</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">algorithm</span><span class="o">:</span> <span class="s1">&#39;aes256&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">key</span><span class="o">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">CRYPTO_KEY</span> <span class="o">||</span> <span class="s1">&#39;Your crypto key goes here&#39;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">sessionSecret</span><span class="o">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">SESSION_SECRET</span> <span class="o">||</span> <span class="s1">&#39;Your session secret goes here&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">twitter</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">consumerKey</span><span class="o">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">TWITTER_KEY</span> <span class="o">||</span> <span class="s1">&#39;Your Twitter consumer key&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">consumerSecret</span><span class="o">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">TWITTER_SECRET</span>  <span class="o">||</span> <span class="s1">&#39;Your Twitter consumer secret&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">callbackURL</span><span class="o">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">TWITTER_CALLBACK</span> <span class="o">||</span> <span class="s1">&#39;http://localhost:3000/auth/twitter/callback&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">passReqToCallback</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>When your application runs in production, you can setup all the necessary environment variables so they are used within your application. When you run locally, it will use the values specified within this module.</p>

<p>The last thing we need to do is use this module within our application. Update the code in <code>server.js</code> from our previous article to look like the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">compression</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;compression&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">secrets</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config/secrets&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Connecting to MongoDB</h3>

<p>If you don&#8217;t already have MondgoDB installed and running, you will want to go their <a href="https://www.mongodb.org/">official site</a> and follow their installation instructions.</p>

<p>There are three things we need to do to connect to MongoDB.</p>

<ol>
<li>Install the Mongoose package</li>
<li>Load the Mongoose package</li>
<li>Connect to it using our connection string</li>
</ol>


<p>Install the package manually using the following command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install mongoose --save
</span></code></pre></td></tr></table></div></figure>


<p>Update the code in <code>server.js</code> from our previous article to look like the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">compression</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;compression&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">secrets</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config/secrets&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Connect to MongoDB</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">compression</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;compression&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">secrets</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config/secrets&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Connect to the twitatron MongoDB</span>
</span><span class='line'><span class="nx">mongoose</span><span class="p">.</span><span class="nx">connect</span><span class="p">(</span><span class="nx">secrets</span><span class="p">.</span><span class="nx">db</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>If all goes well, your application should start up just fine. You will notice we are already using our secrets module for the MongoDB connection string.</p>

<h3>User Model</h3>

<p>We now need a model to store our user. Inside the <code>models</code> directory, create a file named <code>user.js</code> and add the following code to it. If you don&#8217;t have a <code>models</code> directory, go ahead and create one in the root of your application.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">crypto</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;crypto&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">secrets</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../config/secrets&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Define our user schema</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">UserSchema</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">Schema</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">twitterId</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">unique</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">username</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">unique</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">lowercase</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">email</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">lowercase</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="k">default</span><span class="o">:</span> <span class="s1">&#39;&#39;</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">created</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">Date</span><span class="p">,</span> <span class="k">default</span><span class="o">:</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">()</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">accessToken</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">tokenSecret</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">UserSchema</span><span class="p">.</span><span class="nx">methods</span><span class="p">.</span><span class="nx">encrypt</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">algorithm</span> <span class="o">=</span> <span class="nx">secrets</span><span class="p">.</span><span class="nx">cryptos</span><span class="p">.</span><span class="nx">algorithm</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">key</span> <span class="o">=</span> <span class="nx">secrets</span><span class="p">.</span><span class="nx">cryptos</span><span class="p">.</span><span class="nx">key</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">cipher</span> <span class="o">=</span> <span class="nx">crypto</span><span class="p">.</span><span class="nx">createCipher</span><span class="p">(</span><span class="nx">algorithm</span><span class="p">,</span> <span class="nx">key</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">cipher</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nx">text</span><span class="p">,</span> <span class="s1">&#39;utf8&#39;</span><span class="p">,</span> <span class="s1">&#39;hex&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="nx">cipher</span><span class="p">.</span><span class="kr">final</span><span class="p">(</span><span class="s1">&#39;hex&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">UserSchema</span><span class="p">.</span><span class="nx">methods</span><span class="p">.</span><span class="nx">decrypt</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">algorithm</span> <span class="o">=</span> <span class="nx">secrets</span><span class="p">.</span><span class="nx">cryptos</span><span class="p">.</span><span class="nx">algorithm</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">key</span> <span class="o">=</span> <span class="nx">secrets</span><span class="p">.</span><span class="nx">cryptos</span><span class="p">.</span><span class="nx">key</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">decipher</span> <span class="o">=</span> <span class="nx">crypto</span><span class="p">.</span><span class="nx">createDecipher</span><span class="p">(</span><span class="nx">algorithm</span><span class="p">,</span> <span class="nx">key</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">decipher</span><span class="p">.</span><span class="nx">update</span><span class="p">(</span><span class="nx">text</span><span class="p">,</span> <span class="s1">&#39;hex&#39;</span><span class="p">,</span> <span class="s1">&#39;utf8&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="nx">decipher</span><span class="p">.</span><span class="kr">final</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Export the Mongoose model</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">model</span><span class="p">(</span><span class="s1">&#39;User&#39;</span><span class="p">,</span> <span class="nx">UserSchema</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>So what is going on here?</p>

<ol>
<li>We loaded the Mongoose package</li>
<li>Created a Mongoose schema which maps to a MongoDB collection and defines the shape of the documents within that collection.</li>
<li>We defined our schema to contain twitterId, username, email, name, created date, access token, and token secret.</li>
<li>We exported the Mongoose user model for use within our application.</li>
<li>We created two methods on our schema that we will use to encrypt and decrypt the access token and token secret.</li>
</ol>


<h3>Auth Controller</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install passport --save
</span><span class='line'>npm install passport-twitter --save
</span></code></pre></td></tr></table></div></figure>


<p>This will install the standard passport package along with passport-twitter. Passport-twitter will provide our application with Twitter authentication strategies. It will allow us to easily add Twitter login to our app.</p>

<p>In the <code>controllers</code> directory, add a file named <code>auth.js</code> with the following contents.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">passport</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;passport&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">TwitterStrategy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;passport-twitter&#39;</span><span class="p">).</span><span class="nx">Strategy</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">User</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../models/user&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">secrets</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../config/secrets&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">serializeUser</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">user</span><span class="p">,</span> <span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">done</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">deserializeUser</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">user</span><span class="p">,</span> <span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">done</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="k">new</span> <span class="nx">TwitterStrategy</span><span class="p">(</span><span class="nx">secrets</span><span class="p">.</span><span class="nx">twitter</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">accessToken</span><span class="p">,</span> <span class="nx">tokenSecret</span><span class="p">,</span> <span class="nx">profile</span><span class="p">,</span> <span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">User</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">twitterId</span><span class="o">:</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">id</span> <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">existingUser</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">existingUser</span><span class="p">)</span> <span class="k">return</span> <span class="nx">done</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">existingUser</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">user</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">User</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">user</span><span class="p">.</span><span class="nx">twitterId</span> <span class="o">=</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">user</span><span class="p">.</span><span class="nx">username</span> <span class="o">=</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">user</span><span class="p">.</span><span class="nx">email</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">user</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">profile</span><span class="p">.</span><span class="nx">displayName</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">user</span><span class="p">.</span><span class="nx">created</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">user</span><span class="p">.</span><span class="nx">accessToken</span> <span class="o">=</span> <span class="nx">user</span><span class="p">.</span><span class="nx">encrypt</span><span class="p">(</span><span class="nx">accessToken</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">user</span><span class="p">.</span><span class="nx">tokenSecret</span> <span class="o">=</span> <span class="nx">user</span><span class="p">.</span><span class="nx">encrypt</span><span class="p">(</span><span class="nx">tokenSecret</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">user</span><span class="p">.</span><span class="nx">save</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">twitter</span> <span class="o">=</span> <span class="nx">passport</span><span class="p">.</span><span class="nx">authenticate</span><span class="p">(</span><span class="s1">&#39;twitter&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">twitterCallback</span> <span class="o">=</span> <span class="nx">passport</span><span class="p">.</span><span class="nx">authenticate</span><span class="p">(</span><span class="s1">&#39;twitter&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">failureRedirect</span><span class="o">:</span> <span class="s1">&#39;/&#39;</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we are doing here is setting up passport to use the Twitter authentication strategy provided by the passport-twitter package. For our TwitterStrategy, we are defining a callback that will attempt to look up the user using the Twitter profile id and if found not found, create a new user. If all works well, it will return an existing user or create a new user.</p>

<p>The final piece of this is exporting the <code>auth</code> and <code>authCallback</code> functions which will be used within our application as route endpoints responsible for creating and logging users in via Twitter. Open up <code>server.js</code> and set it to the following code.</p>

<p>Also, because Passport Twitter strategy requires sessions, be sure to install the <code>express-session</code> package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install express-session --save
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">compression</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;compression&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">secrets</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config/secrets&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">passport</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;passport&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express-session&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Connect to the twitatron MongoDB</span>
</span><span class='line'><span class="nx">mongoose</span><span class="p">.</span><span class="nx">connect</span><span class="p">(</span><span class="nx">secrets</span><span class="p">.</span><span class="nx">db</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Load controllers</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">homeController</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./controllers/home&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">authController</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./controllers/auth&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Tell Express to use sessions</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">session</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">secret</span><span class="o">:</span> <span class="nx">secrets</span><span class="p">.</span><span class="nx">sessionSecret</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">resave</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">saveUninitialized</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Use the passport package in our application</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">passport</span><span class="p">.</span><span class="nx">initialize</span><span class="p">());</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">passport</span><span class="p">.</span><span class="nx">session</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add content compression middleware</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">compression</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add static middleware</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">oneDay</span> <span class="o">=</span> <span class="mi">86400000</span><span class="p">;</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="kr">static</span><span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">&#39;public&#39;</span><span class="p">),</span> <span class="p">{</span> <span class="nx">maxAge</span><span class="o">:</span> <span class="nx">oneDay</span> <span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add jade view engine</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;views&#39;</span><span class="p">,</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">&#39;views&#39;</span><span class="p">));</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;view engine&#39;</span><span class="p">,</span> <span class="s1">&#39;jade&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express router</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">Router</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Landing page route</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="nx">homeController</span><span class="p">.</span><span class="nx">index</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Auth routes</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/auth/twitter&#39;</span><span class="p">,</span> <span class="nx">authController</span><span class="p">.</span><span class="nx">twitter</span><span class="p">);</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/auth/twitter/callback&#39;</span><span class="p">,</span> <span class="nx">authController</span><span class="p">.</span><span class="nx">twitterCallback</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">redirect</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">returnTo</span> <span class="o">||</span> <span class="s1">&#39;/&#39;</span><span class="p">);});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Register all our routes</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">router</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we did here was to include the passport, express-session, and authController modules. After that we setup our Express application to use passport and passport session as middleware. Finally, we create two new endpoints responsible for logging users in via Twitter.</p>

<p>In order to test this, you will need to head to Twitter and register an application. You can do that here: <a href="https://apps.twitter.com/">https://apps.twitter.com/</a>. Once you have an application, update the consumer key and secret inside <code>secrets.js</code>.</p>

<p>You can now test things out by making a request to <a href="http://localhost:3000/auth/twitter">http://localhost:3000/auth/twitter</a></p>

<h3>Clean up our views</h3>

<p>Before we update our views to support logging in and out, we need to clean up our views and some of the code behind it first.</p>

<p>Open up <code>homeController.js</code> and delete this line from the index action: <code>res.locals.ip = req.ip;</code>.</p>

<p>Open up <code>home.jade</code> and delete this line from the view: <code>h2 You are visiting from #{ip}</code>.</p>

<h3>Allow users to login and logout</h3>

<p>To know whether or not a user is currently logged in, we need to add a little code to our Express application. One of the nice things Passport provides is that it automatically adds a user object to the Express request object when someone is logged in. We can take advantage of this by passing it to our views. Open up <code>server.js</code> and update the code as follows right after we use passport.session.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Setup objects needed by views</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">locals</span><span class="p">.</span><span class="nx">user</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">user</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">next</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we are doing is adding the user object to the locals object in order to make it available in our views.</p>

<p>Next, we will want to update <code>navigation.jade</code> to show login or logout depending on the user&#8217;s state.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='jade'><span class='line'><span class="nt">header</span>
</span><span class='line'>  <span class="nt">div</span>
</span><span class='line'>    <span class="nt">a</span>(<span class="na">href=</span><span class="s">&#39;/&#39;</span>) Twitatron
</span><span class='line'>    <span class="nt">if</span> !user
</span><span class='line'>      <span class="nt">a</span>(<span class="na">href=</span><span class="s">&quot;/auth/twitter&quot;</span>) Login with Twitter
</span><span class='line'>    <span class="nt">else</span>
</span><span class='line'>      <span class="nt">a</span>(<span class="na">href=</span><span class="s">&quot;/auth/logout&quot;</span>) Logout
</span></code></pre></td></tr></table></div></figure>


<p>The last thing we need to implement is a controller action for the route <code>/auth/logout</code>. Open up <code>authController.js</code> and add the following to the very end.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">logout</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">req</span><span class="p">.</span><span class="nx">logout</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">req</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">destroy</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">redirect</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, just define your route within <code>server.js</code> as follows.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Auth routes</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/auth/twitter&#39;</span><span class="p">,</span> <span class="nx">authController</span><span class="p">.</span><span class="nx">twitter</span><span class="p">);</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/auth/twitter/callback&#39;</span><span class="p">,</span> <span class="nx">authController</span><span class="p">.</span><span class="nx">twitterCallback</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">redirect</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">returnTo</span> <span class="o">||</span> <span class="s1">&#39;/&#39;</span><span class="p">);});</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/auth/logout&#39;</span><span class="p">,</span> <span class="nx">authController</span><span class="p">.</span><span class="nx">logout</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Go ahead and try things out. You should be able to click <code>Login with Twitter</code>, get redirected to Twitter, authorize access to your Twitter account, and have a User created or get logged in as an existing user.</p>

<h3>Wrap up</h3>

<p>We covered a lot of areas in this tutorial. First, we added a configuration module which allows easy configuration between development and production. Second, we learned about Mongoose and connected to MongoDB. Third, we created a Mongoose User model and created helper methods that allow us to encrypt and decrypt sensitive information such as access tokens and token secrets. Finally, we added the ability to log in with Twitter, have a user account created, and then log out.</p>

<p>If you found this article or others useful be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>

<p>Source code for this part can be found <a href="https://github.com/scottksmith95/twitatron/tree/master/03">here on GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Algolia Real Time Search With ASP.NET MVC &amp; Windows Phone 8.1]]></title>
    <link href="http://scottksmith.com/blog/2015/04/04/algolia-real-time-search-with-asp-dot-net-mvc-and-windows-phone-8-dot-1/"/>
    <updated>2015-04-04T20:11:00-07:00</updated>
    <id>http://scottksmith.com/blog/2015/04/04/algolia-real-time-search-with-asp-dot-net-mvc-and-windows-phone-8-dot-1</id>
    <content type="html"><![CDATA[<p>In this article, we are going to explore how to easily add Algolia search to a Windows Phone 8.1 application with an ASP.NET MVC backend. To do this, we will take advantage of Algolia&#8217;s <a href="https://github.com/algolia/algoliasearch-client-csharp">C# client</a> to add indexing capabilities to the ASP.NET MVC application and search capabilities to the Windows Phone application.</p>

<p>The application we will be building is called PackageTrack. It is a simple web application where a user can create, read, update, and delete packages they like and use. The web application will be capable of managing the package information, indexing that data with Algolia, and providing a simple REST API for the data. We will also create a Windows Phone application with an auto suggest search box hooked into the Algolia search service to provide search results. Users will then be able to select one of the search results and have that information shown by requesting the data from the web application API.</p>

<h2>Prerequisites</h2>

<p>In order to follow along well, it will be helpful to share versions of tooling, operating system, and technology used for the tutorial. You will need to use (at the very least) Visual Studio 2013 with update 4. Also, in order to develop Windows Phone 8.1 applications, you will need to be developing on Windows 8 or greater. Finally, the application is being built using .NET framework 4.5.</p>

<h2>Create a new ASP.NET Web Application</h2>

<p>With Visual Studio running, create a new solution and choose an ASP.NET Web Application for your initial project. If you want to follow along exactly, name your solution <code>PackageTrack</code> and your project <code>PackageTrack.Web</code>.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_01.png" alt="Screenshot 01" /></p>

<p>To keep this tutorial simple, change the authentication to <code>No Authentication</code>.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_02.png" alt="Screenshot 02" /></p>

<p>You will also want to make sure MVC and Web API are selected.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_03.png" alt="Screenshot 03" /></p>

<h2>Install necessary NuGet packages</h2>

<p>This application requires two new packages in order to work.</p>

<p><strong>Entity Framework</strong></p>

<p>Install the Entity Framework package. The version used in this tutorial is 6.1.3.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>PM&gt; Install-Package EntityFramework
</span></code></pre></td></tr></table></div></figure>


<p><strong>Algolia Search</strong></p>

<p>Install the Algolia Search package. The version used in this tutorial is 3.0.5.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>PM&gt; Install-Package Algolia.Search
</span></code></pre></td></tr></table></div></figure>


<p>Finally, we need to update all installed packages to make sure we are using the latest libraries and scripts. You can do this by right clicking the web project in Solution Explore and choosing <code>Manage NuGet Packages...</code>.</p>

<h2>Cleanup</h2>

<p>Now that we have our packages installed and updated, we need to perform a little cleanup in our project.</p>

<p>First, let&#8217;s delete the Home Controller, <code>HomeController.cs</code>, and the <code>Home</code> directory within <code>Views</code>. We are removing the controller and its views because we will be creating our own later.</p>

<h2>Update our layout</h2>

<p>Our layout needs a little updating to improve the look and feel a bit. Update <code>\Vieews\Shared\_Layout.cshtml</code> with the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">&quot;utf-8&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">&quot;viewport&quot;</span> <span class="na">content=</span><span class="s">&quot;width=device-width, initial-scale=1.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Package Track<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    @Styles.Render(&quot;~/Content/css&quot;)
</span><span class='line'>    @Scripts.Render(&quot;~/bundles/modernizr&quot;)
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;navbar navbar-inverse navbar-fixed-top&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;navbar-header&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                @Html.ActionLink(&quot;Package Track&quot;, &quot;Index&quot;, &quot;Home&quot;, new { area = &quot;&quot; }, new { @class = &quot;navbar-brand&quot; })
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container body-content&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        @RenderBody()
</span><span class='line'>        <span class="nt">&lt;hr</span> <span class="nt">/&gt;</span>
</span><span class='line'>        <span class="nt">&lt;footer&gt;</span>
</span><span class='line'>            <span class="nt">&lt;p&gt;</span><span class="ni">&amp;copy;</span> @DateTime.Now.Year - <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;https://www.algolia.com/&quot;</span> <span class="na">target=</span><span class="s">&quot;_blank&quot;</span><span class="nt">&gt;</span>Algolia<span class="nt">&lt;/a&gt;&lt;/p&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/footer&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>    @Scripts.Render(&quot;~/bundles/jquery&quot;)
</span><span class='line'>    @Scripts.Render(&quot;~/bundles/bootstrap&quot;)
</span><span class='line'>    @RenderSection(&quot;scripts&quot;, required: false)
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Entity Framework and Database</h2>

<p>We are now ready to create our model and DbContext in order to take advantage of Entity Framework. What we will do is a create a simple model to represent our package that we want to store in the database. After that, we will create our DbContext which will allow us to easily add, remove, update, and more on our packages stored in the database.</p>

<p>By default, the project is setup to use a local MDF database. You are welcome to change it but for simplicity this tutorial will not.</p>

<p>To create our package model, create a new file named <code>Package.cs</code> inside the <code>Models</code> directory. Update the created class to look like the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">Package</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="kt">int</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">public</span> <span class="kt">string</span> <span class="n">Link</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">public</span> <span class="kt">int</span> <span class="n">Count</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, we need to create our DbContext. To do this, create a new directory called <code>Data</code> at the root of the project. Then create a new file named <code>PackageTrackContext.cs</code> inside this new directory. Update the code to the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">using</span> <span class="nn">PackageTrack.Web.Models</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Data.Entity</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Linq</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Web</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">namespace</span> <span class="nn">PackageTrack.Web.Data</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">class</span> <span class="nc">PackageTrackDbContext</span> <span class="p">:</span> <span class="n">DbContext</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">public</span> <span class="n">DbSet</span><span class="p">&lt;</span><span class="n">Package</span><span class="p">&gt;</span> <span class="n">Packages</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Before moving on, be sure to build your solution. This will be necessary for the next steps where we use Visual Studio tooling to scaffold our CRUD controller and views for us.</p>

<h2>Package CRUD</h2>

<p>We now need to create the controller, actions, and views in order to create, read, update, and delete packages. To do this we will use Visual Studio tooling. This will make it super simple. The following 3 screenshots show what to do.</p>

<p>First, right click the <code>Controller</code> directory and choose <code>Add</code> followed by <code>Controller</code>.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_04.png" alt="Screenshot 04" /></p>

<p>Next, choose <code>MVC 5 Controller with views, using Entity Framework</code>.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_05.png" alt="Screenshot 05" /></p>

<p>Finally, be sure to choose the Package model we created for the <code>Model class</code>, the PackageTrackDbContext we created for the <code>Data context class</code>, check <code>Use async controller actions</code>, and set the <code>Controller name</code> to HomeController.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_06.png" alt="Screenshot 06" /></p>

<p>Visual Studio should create a new HomeController along with a set of views. You can now build and run your project. You should be able to create, read, update, and delete packages. Go head and do this now and create a few packages. We will need them later.</p>

<h2>Build an Admin controller</h2>

<p>We now need to create an Admin controller that will provide us the ability to issue index, re-index, and delete commands to our Algolia index.</p>

<p>Inside the <code>Controllers</code> directory, create a file named <code>AdminController.cs</code>. Update it to contain the following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">using</span> <span class="nn">Algolia.Search</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">PackageTrack.Web.Data</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">PackageTrack.Web.Models</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Linq</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Threading.Tasks</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Web</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Web.Mvc</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">namespace</span> <span class="nn">PackageTrack.Web.Controllers</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">class</span> <span class="nc">AdminController</span> <span class="p">:</span> <span class="n">Controller</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">private</span> <span class="n">PackageTrackDbContext</span> <span class="n">db</span> <span class="p">=</span> <span class="k">new</span> <span class="n">PackageTrackDbContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Index</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nf">View</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">        [HttpPost]</span>
</span><span class='line'><span class="na">        [ValidateAntiForgeryToken]</span>
</span><span class='line'>        <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">ActionResult</span><span class="p">&gt;</span> <span class="n">ReIndexData</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nf">View</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">        [HttpPost]</span>
</span><span class='line'><span class="na">        [ValidateAntiForgeryToken]</span>
</span><span class='line'>        <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">ActionResult</span><span class="p">&gt;</span> <span class="n">IndexData</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nf">View</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">        [HttpPost]</span>
</span><span class='line'><span class="na">        [ValidateAntiForgeryToken]</span>
</span><span class='line'>        <span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">ActionResult</span><span class="p">&gt;</span> <span class="n">DeleteData</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="nf">View</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">(</span><span class="kt">bool</span> <span class="n">disposing</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="n">disposing</span><span class="p">)</span>
</span><span class='line'>            <span class="p">{</span>
</span><span class='line'>                <span class="n">db</span><span class="p">.</span><span class="n">Dispose</span><span class="p">();</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">base</span><span class="p">.</span><span class="n">Dispose</span><span class="p">(</span><span class="n">disposing</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Inside the <code>Views</code> directory, create a new directory named <code>Admin</code>. Now that we have a new place for our admin views, create a new view there named <code>Index.cshml</code>. This is where we will setup our ability to issue index commands. Update the view with the following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;h2&gt;</span>Admin<span class="nt">&lt;/h2&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;hr</span> <span class="nt">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;form-actions no-color&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        @using (Html.BeginForm(&quot;reindexdata&quot;, &quot;admin&quot;))
</span><span class='line'>        {
</span><span class='line'>            @Html.AntiForgeryToken()
</span><span class='line'>            <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">value=</span><span class="s">&quot;Re-Index Data&quot;</span> <span class="na">class=</span><span class="s">&quot;btn btn-default&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>        }
</span><span class='line'>        <span class="nt">&lt;br</span> <span class="nt">/&gt;</span>
</span><span class='line'>        @using (Html.BeginForm(&quot;indexdata&quot;, &quot;admin&quot;))
</span><span class='line'>        {
</span><span class='line'>            @Html.AntiForgeryToken()
</span><span class='line'>            <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">value=</span><span class="s">&quot;Index Data&quot;</span> <span class="na">class=</span><span class="s">&quot;btn btn-default&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>        }
</span><span class='line'>        <span class="nt">&lt;br</span> <span class="nt">/&gt;</span>
</span><span class='line'>        @using (Html.BeginForm(&quot;deletedata&quot;, &quot;admin&quot;))
</span><span class='line'>        {
</span><span class='line'>            @Html.AntiForgeryToken()
</span><span class='line'>            <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">value=</span><span class="s">&quot;Delete Data&quot;</span> <span class="na">class=</span><span class="s">&quot;btn btn-default&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>        }
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we need to create 3 views that can be used to show when our index commands have completed. Create the following views with their markup inside the <code>Views\Admin</code> directory.</p>

<p><strong>ReIndexData.cshtml</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;h2&gt;</span>Data Re-Indexed<span class="nt">&lt;/h2&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>IndexData.cshtml</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;h2&gt;</span>Data Indexed<span class="nt">&lt;/h2&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>DeleteData.cshtml</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;h2&gt;</span>Data Deleted<span class="nt">&lt;/h2&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Algolia time</h2>

<p>Up to this point, we have been doing standard .NET development and nothing with Algolia (except adding the NuGet package). We are now ready to start.</p>

<p>Since our web application allows our users to create, update, and delete packages, we need to be able to do the same things to our Algolia index. On top of that, there are cases where we need to perform an index on all of our data, do a full re-index where data is removed and then added, and also remove all data from our index. We do all this from our web application rather than the Windows Phone application because it is much more secure to have our server talking to Algolia rather than each client. We don&#8217;t want our credentials that allow changing index data to fall into a user&#8217;s hand.</p>

<h3>Create reusable Algolia client</h3>

<p>The AlgoliaClient allows our application to easily interact with our Algolia index. In order to keep performance optimal, we don&#8217;t want to create an instance of this client each time we need it. To address this, we will create one AlgoliaClient and store it in an Application Variable.</p>

<p>Let&#8217;s go ahead and do this now.</p>

<p>Open up your <code>Global.asax.cs</code> file and update it as follows.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">using</span> <span class="nn">Algolia.Search</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">PackageTrack.Web.Data</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">PackageTrack.Web.Models</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Linq</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Web</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Web.Http</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Web.Mvc</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Web.Optimization</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="nn">System.Web.Routing</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">namespace</span> <span class="nn">PackageTrack.Web</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">class</span> <span class="nc">MvcApplication</span> <span class="p">:</span> <span class="n">System</span><span class="p">.</span><span class="n">Web</span><span class="p">.</span><span class="n">HttpApplication</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">protected</span> <span class="k">void</span> <span class="nf">Application_Start</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">AreaRegistration</span><span class="p">.</span><span class="n">RegisterAllAreas</span><span class="p">();</span>
</span><span class='line'>            <span class="n">GlobalConfiguration</span><span class="p">.</span><span class="n">Configure</span><span class="p">(</span><span class="n">WebApiConfig</span><span class="p">.</span><span class="n">Register</span><span class="p">);</span>
</span><span class='line'>            <span class="n">FilterConfig</span><span class="p">.</span><span class="n">RegisterGlobalFilters</span><span class="p">(</span><span class="n">GlobalFilters</span><span class="p">.</span><span class="n">Filters</span><span class="p">);</span>
</span><span class='line'>            <span class="n">RouteConfig</span><span class="p">.</span><span class="n">RegisterRoutes</span><span class="p">(</span><span class="n">RouteTable</span><span class="p">.</span><span class="n">Routes</span><span class="p">);</span>
</span><span class='line'>            <span class="n">BundleConfig</span><span class="p">.</span><span class="n">RegisterBundles</span><span class="p">(</span><span class="n">BundleTable</span><span class="p">.</span><span class="n">Bundles</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Create our Algolia client</span>
</span><span class='line'>            <span class="kt">var</span> <span class="n">algoliaClient</span> <span class="p">=</span> <span class="k">new</span> <span class="n">AlgoliaClient</span><span class="p">(</span><span class="s">&quot;&lt;APPLICATION_ID&gt;&quot;</span><span class="p">,</span> <span class="s">&quot;&lt;ADMIN_API_KEY&gt;&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Create our index helper</span>
</span><span class='line'>            <span class="kt">var</span> <span class="n">indexHelper</span> <span class="p">=</span> <span class="k">new</span> <span class="n">IndexHelper</span><span class="p">&lt;</span><span class="n">Package</span><span class="p">&gt;(</span><span class="n">algoliaClient</span><span class="p">,</span> <span class="s">&quot;packages&quot;</span><span class="p">,</span> <span class="s">&quot;Id&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// Store our index helper in an application variable.</span>
</span><span class='line'>            <span class="c1">// We don&#39;t want to create a new one each time</span>
</span><span class='line'>            <span class="c1">// because it will impact performance.</span>
</span><span class='line'>            <span class="n">Application</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="s">&quot;PackageIndexHelper&quot;</span><span class="p">,</span> <span class="n">indexHelper</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we are doing here is first creating an AlgoliaClient using our application id and key. You will need to update these two values using your own credentials. You can either use the Admin key already created for you or create your own key and choose the permissions allowed.</p>

<p>Next, we create an IndexHelper and inject our AlgoliaClient into it along with the name of the index and the value of our Package model identifier that should be mapped to the Algolia index object Id. The reason we want to specify the identifier in our model is because the IndexHelper will automatically build and  map our model to the Algolia index object.</p>

<p>Finally, we add our IndexHlper to the application variable so we can use it elsewhere in our application.</p>

<p>One thing to note is the index we are using in Algolia is called <code>packages</code>. You can either create it ahead of time or it will be automatically created when you issue index commands.</p>

<h3>Update our Admin controller to work with Algolia</h3>

<p>Now that we have an Algolia IndexHelper to use, we need to update our Admin controller to talk to Algolia when someone issues an indexing command.</p>

<p>Update each of the 3 following actions inside <code>AdminController.cs</code>. Make sure and add a using statement for Algolia.Search.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="na">[HttpPost]</span>
</span><span class='line'><span class="na">[ValidateAntiForgeryToken]</span>
</span><span class='line'><span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">ActionResult</span><span class="p">&gt;</span> <span class="n">ReIndexData</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">// Get the package index helper from Application variable</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">packageIndexHelper</span> <span class="p">=</span> <span class="n">HttpContext</span><span class="p">.</span><span class="n">Application</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="s">&quot;PackageIndexHelper&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">IndexHelper</span><span class="p">&lt;</span><span class="n">Package</span><span class="p">&gt;;</span>
</span><span class='line'>    <span class="k">await</span> <span class="n">packageIndexHelper</span><span class="p">.</span><span class="n">OverwriteIndexAsync</span><span class="p">(</span><span class="n">db</span><span class="p">.</span><span class="n">Packages</span><span class="p">,</span> <span class="m">1000</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nf">View</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">[HttpPost]</span>
</span><span class='line'><span class="na">[ValidateAntiForgeryToken]</span>
</span><span class='line'><span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">ActionResult</span><span class="p">&gt;</span> <span class="n">IndexData</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">// Get the package index helper from Application variable</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">packageIndexHelper</span> <span class="p">=</span> <span class="n">HttpContext</span><span class="p">.</span><span class="n">Application</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="s">&quot;PackageIndexHelper&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">IndexHelper</span><span class="p">&lt;</span><span class="n">Package</span><span class="p">&gt;;</span>
</span><span class='line'>    <span class="k">await</span> <span class="n">packageIndexHelper</span><span class="p">.</span><span class="n">SaveObjectsAsync</span><span class="p">(</span><span class="n">db</span><span class="p">.</span><span class="n">Packages</span><span class="p">,</span> <span class="m">1000</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nf">View</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">[HttpPost]</span>
</span><span class='line'><span class="na">[ValidateAntiForgeryToken]</span>
</span><span class='line'><span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">ActionResult</span><span class="p">&gt;</span> <span class="n">DeleteData</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">// Get the package index helper from Application variable</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">packageIndexHelper</span> <span class="p">=</span> <span class="n">HttpContext</span><span class="p">.</span><span class="n">Application</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="s">&quot;PackageIndexHelper&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">IndexHelper</span><span class="p">&lt;</span><span class="n">Package</span><span class="p">&gt;;</span>
</span><span class='line'>    <span class="k">await</span> <span class="n">packageIndexHelper</span><span class="p">.</span><span class="n">DeleteObjectsAsync</span><span class="p">(</span><span class="n">db</span><span class="p">.</span><span class="n">Packages</span><span class="p">,</span> <span class="m">1000</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nf">View</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The IndexHelper is very nice. It will automatically handle the steps needed to perform indexing, re-indexing, and deleting of data. The way it works is it already knows the identifier to look for in your model so when you make an OverwriteIndex, SaveObjects, or DeleteObjects call it automatically converts your model to JSON, adds an objectId field, sets the objectId field to the identifier you told it to use, and makes the necessary calls to Algolia.</p>

<p>Now is a great time to test things out. You should already have packages in your database that are not in your Algolia index. Try out the different functions under the <code>/admin</code> path. You should see your index get populated, re-populated, and cleared out depending on which function you use.</p>

<h3>Update our CRUD to work with Algolia</h3>

<p>Having administrative ability to manage our index is great, but we really need to have our index kept up to date as users create, update, and delete packages from our database.</p>

<p>We will do this by updating the actions inside our Home controller we created earlier to support our CRUD operations on packages.</p>

<p>Update each of the 3 following actions inside <code>HomeController.cs</code>. Make sure and add a using statement for Algolia.Search.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="na">[HttpPost]</span>
</span><span class='line'><span class="na">[ValidateAntiForgeryToken]</span>
</span><span class='line'><span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">ActionResult</span><span class="p">&gt;</span> <span class="n">Create</span><span class="p">([</span><span class="n">Bind</span><span class="p">(</span><span class="n">Include</span> <span class="p">=</span> <span class="s">&quot;Id,Name,Link,Count&quot;</span><span class="p">)]</span> <span class="n">Package</span> <span class="n">package</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">ModelState</span><span class="p">.</span><span class="n">IsValid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">db</span><span class="p">.</span><span class="n">Packages</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">package</span><span class="p">);</span>
</span><span class='line'>        <span class="k">await</span> <span class="n">db</span><span class="p">.</span><span class="n">SaveChangesAsync</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Get the package index helper from Application variable</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">packageIndexHelper</span> <span class="p">=</span> <span class="n">HttpContext</span><span class="p">.</span><span class="n">Application</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="s">&quot;PackageIndexHelper&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">IndexHelper</span><span class="p">&lt;</span><span class="n">Package</span><span class="p">&gt;;</span>
</span><span class='line'>        <span class="k">await</span> <span class="n">packageIndexHelper</span><span class="p">.</span><span class="n">SaveObjectAsync</span><span class="p">(</span><span class="n">package</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nf">RedirectToAction</span><span class="p">(</span><span class="s">&quot;Index&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nf">View</span><span class="p">(</span><span class="n">package</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">[HttpPost]</span>
</span><span class='line'><span class="na">[ValidateAntiForgeryToken]</span>
</span><span class='line'><span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">ActionResult</span><span class="p">&gt;</span> <span class="n">Edit</span><span class="p">([</span><span class="n">Bind</span><span class="p">(</span><span class="n">Include</span> <span class="p">=</span> <span class="s">&quot;Id,Name,Link,Count&quot;</span><span class="p">)]</span> <span class="n">Package</span> <span class="n">package</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">ModelState</span><span class="p">.</span><span class="n">IsValid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">db</span><span class="p">.</span><span class="n">Entry</span><span class="p">(</span><span class="n">package</span><span class="p">).</span><span class="n">State</span> <span class="p">=</span> <span class="n">EntityState</span><span class="p">.</span><span class="n">Modified</span><span class="p">;</span>
</span><span class='line'>        <span class="k">await</span> <span class="n">db</span><span class="p">.</span><span class="n">SaveChangesAsync</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Get the package index helper from Application variable</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">packageIndexHelper</span> <span class="p">=</span> <span class="n">HttpContext</span><span class="p">.</span><span class="n">Application</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="s">&quot;PackageIndexHelper&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">IndexHelper</span><span class="p">&lt;</span><span class="n">Package</span><span class="p">&gt;;</span>
</span><span class='line'>        <span class="k">await</span> <span class="n">packageIndexHelper</span><span class="p">.</span><span class="n">SaveObjectAsync</span><span class="p">(</span><span class="n">package</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nf">RedirectToAction</span><span class="p">(</span><span class="s">&quot;Index&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="nf">View</span><span class="p">(</span><span class="n">package</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">[HttpPost, ActionName(&quot;Delete&quot;)]</span>
</span><span class='line'><span class="na">[ValidateAntiForgeryToken]</span>
</span><span class='line'><span class="k">public</span> <span class="k">async</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">ActionResult</span><span class="p">&gt;</span> <span class="n">DeleteConfirmed</span><span class="p">(</span><span class="kt">int</span> <span class="n">id</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Package</span> <span class="n">package</span> <span class="p">=</span> <span class="k">await</span> <span class="n">db</span><span class="p">.</span><span class="n">Packages</span><span class="p">.</span><span class="n">FindAsync</span><span class="p">(</span><span class="n">id</span><span class="p">);</span>
</span><span class='line'>    <span class="n">db</span><span class="p">.</span><span class="n">Packages</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">package</span><span class="p">);</span>
</span><span class='line'>    <span class="k">await</span> <span class="n">db</span><span class="p">.</span><span class="n">SaveChangesAsync</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Get the package index helper from Application variable</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">packageIndexHelper</span> <span class="p">=</span> <span class="n">HttpContext</span><span class="p">.</span><span class="n">Application</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="s">&quot;PackageIndexHelper&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">IndexHelper</span><span class="p">&lt;</span><span class="n">Package</span><span class="p">&gt;;</span>
</span><span class='line'>    <span class="k">await</span> <span class="n">packageIndexHelper</span><span class="p">.</span><span class="n">DeleteObjectAsync</span><span class="p">(</span><span class="n">package</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nf">RedirectToAction</span><span class="p">(</span><span class="s">&quot;Index&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we did here was whenever a package is created, updated, or deleted, we use the IndexHelper to add, update, or remove the data within our index.</p>

<p>Go ahead and try it out.</p>

<h2>Implement real time search</h2>

<p>With all of our indexing in place, we are ready to add a real time search experience to our web application.</p>

<h3>Download JavaScript libraries</h3>

<p>We will need some JavaScript libraries in order to create the search feature. Download each of the following and save them in the <code>Scripts</code> directory with the names I indicate.</p>

<p><strong>typeahead.jquery.js</strong><br/>
<a href="https://cdn.jsdelivr.net/typeahead.js/0.10.5/typeahead.jquery.min.js">https://cdn.jsdelivr.net/typeahead.js/0.10.5/typeahead.jquery.min.js</a></p>

<p><strong>hogan.common.js</strong><br/>
<a href="https://cdn.jsdelivr.net/hogan.js/3.0.2/hogan.common.js">https://cdn.jsdelivr.net/hogan.js/3.0.2/hogan.common.js</a></p>

<p><strong>algoliasearch.min.js</strong><br/>
<a href="https://cdn.jsdelivr.net/algoliasearch/2.9/algoliasearch.min.js">https://cdn.jsdelivr.net/algoliasearch/3/algoliasearch.min.js</a></p>

<h3>Bundle new JavaScript</h3>

<p>With the new scripts added to our project, we need to update our bundles to include them. Open up <code>\App_Start\BundleConfig.cs</code> and add the following new bundle.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="n">bundles</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">ScriptBundle</span><span class="p">(</span><span class="s">&quot;~/bundles/main&quot;</span><span class="p">).</span><span class="n">Include</span><span class="p">(</span>
</span><span class='line'>          <span class="s">&quot;~/Scripts/typeahead.jquery.min.js&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="s">&quot;~/Scripts/hogan.common.js&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="s">&quot;~/Scripts/algoliasearch.min.js&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="s">&quot;~/Scripts/main.js&quot;</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Update our layout</h3>

<p>Now we need to update our layout to include a search box and the new script bundle we created.</p>

<p>Open up <code>_Layout.cshtml</code> and modify the code as follows.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>....
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;navbar navbar-inverse navbar-fixed-top&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;navbar-header&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            @Html.ActionLink(&quot;Package Track&quot;, &quot;Index&quot;, &quot;Home&quot;, new { area = &quot;&quot; }, new { @class = &quot;navbar-brand&quot; })
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;typeahead-container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;input</span> <span class="na">id=</span><span class="s">&quot;typeahead-algolia&quot;</span> <span class="na">class=</span><span class="s">&quot;typeahead&quot;</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">placeholder=</span><span class="s">&quot;Search...&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>...
</span><span class='line'>
</span><span class='line'>@Scripts.Render(&quot;~/bundles/jquery&quot;)
</span><span class='line'>@Scripts.Render(&quot;~/bundles/bootstrap&quot;)
</span><span class='line'>@Scripts.Render(&quot;~/bundles/main&quot;)
</span><span class='line'>@RenderSection(&quot;scripts&quot;, required: false)
</span></code></pre></td></tr></table></div></figure>


<h3>Create JavaScript to tie UI with Algolia</h3>

<p>The following code needs to be added to a new file named <code>main.js</code> within the <code>Scripts</code> directory. This sets us up to perform searches with our packages index on Algolia. Be sure to update the application id and key using your search only key.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;&lt;APPLICATION ID&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;SEARCH-ONLY API KEY&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;&lt;INDEX NAME&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">template</span> <span class="o">=</span> <span class="nx">Hogan</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span>
</span><span class='line'>        <span class="s1">&#39;&lt;a href=&quot;/home/details/}&quot;&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>            <span class="s1">&#39;&lt;div class=&quot;hit&quot;&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>                <span class="s1">&#39;&lt;div class=&quot;name&quot;&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>                    <span class="s1">&#39;} &#39;</span> <span class="o">+</span>
</span><span class='line'>                <span class="s1">&#39;&lt;/div&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>                <span class="s1">&#39;&#39;</span> <span class="o">+</span>
</span><span class='line'>                <span class="s1">&#39;&lt;div class=&quot;attribute&quot;&gt;: }&lt;/div&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>                <span class="s1">&#39;&#39;</span> <span class="o">+</span>
</span><span class='line'>            <span class="s1">&#39;&lt;/div&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>        <span class="s1">&#39;&lt;/a&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#typeahead-algolia&#39;</span><span class="p">).</span><span class="nx">typeahead</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">highlight</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">hint</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">minLength</span><span class="o">:</span> <span class="mi">1</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nx">source</span><span class="o">:</span> <span class="nx">index</span><span class="p">.</span><span class="nx">ttAdapter</span><span class="p">({</span> <span class="s2">&quot;hitsPerPage&quot;</span><span class="o">:</span> <span class="mi">10</span> <span class="p">}),</span>
</span><span class='line'>        <span class="nx">displayKey</span><span class="o">:</span> <span class="s1">&#39;Name&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">templates</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">suggestion</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">hit</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// select matching attributes only</span>
</span><span class='line'>                <span class="nx">hit</span><span class="p">.</span><span class="nx">attributes</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>                <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">attribute</span> <span class="k">in</span> <span class="nx">hit</span><span class="p">.</span><span class="nx">_highlightResult</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">if</span> <span class="p">(</span><span class="nx">attribute</span> <span class="o">===</span> <span class="s1">&#39;Name&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                        <span class="c1">// already handled by the template</span>
</span><span class='line'>                        <span class="k">continue</span><span class="p">;</span>
</span><span class='line'>                    <span class="p">}</span>
</span><span class='line'>                    <span class="c1">// all others attributes that are matching should be added in the attributes array</span>
</span><span class='line'>                    <span class="c1">// so we can display them in the dropdown menu. Non-matching attributes are skipped.</span>
</span><span class='line'>                    <span class="k">if</span> <span class="p">(</span><span class="nx">hit</span><span class="p">.</span><span class="nx">_highlightResult</span><span class="p">[</span><span class="nx">attribute</span><span class="p">].</span><span class="nx">matchLevel</span> <span class="o">!==</span> <span class="s1">&#39;none&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                        <span class="nx">hit</span><span class="p">.</span><span class="nx">attributes</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span> <span class="nx">attribute</span><span class="o">:</span> <span class="nx">attribute</span><span class="p">,</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">hit</span><span class="p">.</span><span class="nx">_highlightResult</span><span class="p">[</span><span class="nx">attribute</span><span class="p">].</span><span class="nx">value</span> <span class="p">});</span>
</span><span class='line'>                    <span class="p">}</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>                <span class="c1">// render the hit using Hogan.js</span>
</span><span class='line'>                <span class="k">return</span> <span class="nx">template</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="nx">hit</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Style the search</h3>

<p>Finally, we want to style our search. Add the following CSS to <code>\Content\Site.css</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nc">.typeahead-container</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">float</span><span class="o">:</span> <span class="k">right</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.typeahead</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">padding</span><span class="o">:</span> <span class="m">0</span> <span class="m">5px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">margin-top</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">width</span><span class="o">:</span> <span class="m">300px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">font-size</span><span class="o">:</span> <span class="m">14px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">line-height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">max-width</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-input</span><span class="o">,</span>
</span><span class='line'><span class="nc">.tt-hint</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">width</span><span class="o">:</span> <span class="m">396px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">padding</span><span class="o">:</span> <span class="m">8px</span> <span class="m">12px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">font-size</span><span class="o">:</span> <span class="m">14px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">line-height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">border</span><span class="o">:</span> <span class="m">2px</span> <span class="k">solid</span> <span class="m">#ccc</span><span class="p">;</span>
</span><span class='line'>    <span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">8px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">outline</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-input</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="k">inset</span> <span class="m">0</span> <span class="m">1px</span> <span class="m">1px</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">.</span><span class="m">075</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-hint</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">color</span><span class="o">:</span> <span class="m">#999</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-dropdown-menu</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">width</span><span class="o">:</span> <span class="m">422px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">margin-top</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">padding</span><span class="o">:</span> <span class="m">8px</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">background-color</span><span class="o">:</span> <span class="m">#fff</span><span class="p">;</span>
</span><span class='line'>    <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="m">#ccc</span><span class="p">;</span>
</span><span class='line'>    <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">.</span><span class="m">2</span><span class="p">);</span>
</span><span class='line'>    <span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">8px</span><span class="p">;</span>
</span><span class='line'>    <span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="m">0</span> <span class="m">5px</span> <span class="m">10px</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span><span class="m">0</span><span class="o">,</span><span class="m">0</span><span class="o">,.</span><span class="m">2</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-suggestion</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">padding</span><span class="o">:</span> <span class="m">3px</span> <span class="m">20px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">font-size</span><span class="o">:</span> <span class="m">14px</span><span class="p">;</span>
</span><span class='line'>    <span class="k">line-height</span><span class="o">:</span> <span class="m">24px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nc">.tt-suggestion.tt-cursor</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">color</span><span class="o">:</span> <span class="m">#fff</span><span class="p">;</span>
</span><span class='line'>        <span class="k">background-color</span><span class="o">:</span> <span class="m">#0097cf</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nc">.tt-suggestion</span> <span class="nt">p</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">margin</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nc">.tt-suggestion</span> <span class="nt">em</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">font-weight</span><span class="o">:</span> <span class="k">bold</span><span class="p">;</span>
</span><span class='line'>        <span class="k">font-style</span><span class="o">:</span> <span class="k">normal</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.name</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">font-weight</span><span class="o">:</span> <span class="k">bold</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.attribute</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">margin-left</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you would like to get a more in depth tutorial on the real time search piece we just added, you can read other articles I wrote here.</p>

<p><a href="http://scottksmith.com/blog/2014/10/21/getting-started-with-algolia-real-time-search/">http://scottksmith.com/blog/2014/10/21/getting-started-with-algolia-real-time-search/</a></p>

<p><a href="http://scottksmith.com/blog/2014/10/29/algolia-real-time-search-with-twitters-typeaheadjs/">http://scottksmith.com/blog/2014/10/29/algolia-real-time-search-with-twitters-typeaheadjs/</a></p>

<h2>Create REST API for packages</h2>

<p>The last thing we need to do in our web application is to build a REST based API for our package information. This will be used by our Windows Phone application.</p>

<p>First, create a new directory within the <code>Controllers</code> directory and name it <code>Api</code>.</p>

<p>Right click on the Api folder and choose <code>Add</code> followed by <code>Controller</code>. Follow the next few screenshots to see what settings to use and values to set.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_07.png" alt="Screenshot 07" /></p>

<p><img src="http://scottksmith.com/images/algolia_csharp_08.png" alt="Screenshot 08" /></p>

<p><img src="http://scottksmith.com/images/algolia_csharp_09.png" alt="Screenshot 09" /></p>

<p>Because we want to only return JSON even when the request header is not <code>application/json</code> we need to update our <code>WebApiConfig.cs</code> file in the <code>App_Start</code> directory.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">using</span> <span class="nn">System.Net.Http.Headers</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">...</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">config</span><span class="p">.</span><span class="n">Formatters</span><span class="p">.</span><span class="n">JsonFormatter</span><span class="p">.</span><span class="n">SupportedMediaTypes</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">MediaTypeHeaderValue</span><span class="p">(</span><span class="s">&quot;text/html&quot;</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>We are now ready to create our Windows Phone application that will perform searches using Algolia and show data from our web application.</p>

<h2>Create a new Windows Phone Application</h2>

<p>In our current solution, create a new project and choose <code>Blank App (Windows Phone)</code>. You can name it whatever you like, but I went with PackageTrack.Phone.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_10.png" alt="Screenshot 10" /></p>

<h2>Install necessary NuGet package</h2>

<p>This application requires one new package in order to work.</p>

<p><strong>Algolia Search</strong></p>

<p>Install the Algolia Search package. The version used in this tutorial is 3.0.5.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>PM&gt; Install-Package Algolia.Search
</span></code></pre></td></tr></table></div></figure>


<h2>Configure startup projects</h2>

<p>In order for both applications to work, we need to configure our solution to start the web and phone application when we build and run. The following screenshots show how to do this.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_11.png" alt="Screenshot 11" /></p>

<p><img src="http://scottksmith.com/images/algolia_csharp_12.png" alt="Screenshot 12" /></p>

<p>Debug or run your applications now to make sure both projects start.</p>

<h2>Build our application UI</h2>

<p>Now that our project and solution are ready to go, we can add some components to our application to build out our UI.</p>

<p>If <code>MainPage.xaml</code> is not open, you will want to open it now. This will load the designer view. The next two steps and screenshots show the two components we want to add to our view. Just drag each of the components from the Toolbox within Visual Studio into your UI as shown below.</p>

<h3>Add AutoSuggestBox</h3>

<p><img src="http://scottksmith.com/images/algolia_csharp_13.png" alt="Screenshot 13" /></p>

<h3>Add WebView</h3>

<p><img src="http://scottksmith.com/images/algolia_csharp_14.png" alt="Screenshot 14" /></p>

<p><img src="http://scottksmith.com/images/algolia_csharp_15.png" alt="Screenshot 15" /></p>

<h3>Configure WebView</h3>

<p>We need to give our WebView a name so we can reference it within our code. You will need to name it <code>SearchWebView</code>. The following code shows the updated XAML for this change.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;WebView</span> <span class="na">Name=</span><span class="s">&quot;SearchWebView&quot;</span> <span class="na">HorizontalAlignment=</span><span class="s">&quot;Left&quot;</span> <span class="na">Height=</span><span class="s">&quot;576&quot;</span> <span class="na">Margin=</span><span class="s">&quot;10,54,0,0&quot;</span> <span class="na">VerticalAlignment=</span><span class="s">&quot;Top&quot;</span> <span class="na">Width=</span><span class="s">&quot;380&quot;</span><span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Configure AutoSuggestBox events</h3>

<p>Our AutoSuggestBox is where the user will start typing a search query and will be responsible for searching our index on Algolia. We need to setup two events to handle when the text changes and when a suggestion is selected.</p>

<p>Update the MainPage XAML to the following for the AutoSuggestBox.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="nt">&lt;AutoSuggestBox</span> <span class="na">HorizontalAlignment=</span><span class="s">&quot;Left&quot;</span> <span class="na">Margin=</span><span class="s">&quot;10,10,0,0&quot;</span> <span class="na">VerticalAlignment=</span><span class="s">&quot;Top&quot;</span> <span class="na">Width=</span><span class="s">&quot;380&quot;</span> <span class="na">TextChanged=</span><span class="s">&quot;AutoSuggestBox_TextChanged&quot;</span> <span class="na">SuggestionChosen=</span><span class="s">&quot;AutoSuggestBox_SuggestionChosen&quot;</span><span class="nt">/&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>When adding new event handlers in this fashion, the code behind is automatically created in <code>MainPage.xaml.cs</code>. If they are not there, be sure to add them as follows.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">private</span> <span class="k">void</span> <span class="nf">AutoSuggestBox_TextChanged</span><span class="p">(</span><span class="n">AutoSuggestBox</span> <span class="n">sender</span><span class="p">,</span> <span class="n">AutoSuggestBoxTextChangedEventArgs</span> <span class="n">args</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">private</span> <span class="k">void</span> <span class="nf">AutoSuggestBox_SuggestionChosen</span><span class="p">(</span><span class="n">AutoSuggestBox</span> <span class="n">sender</span><span class="p">,</span> <span class="n">AutoSuggestBoxSuggestionChosenEventArgs</span> <span class="n">args</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Add Algolia to our application</h2>

<p>If you don&#8217;t have <code>MainPage.xaml.cs</code> open, open it now.</p>

<p>We are going to add the necessary code to add Algolia search capabilities to our application.</p>

<p>The first thing we need is to add two private members to our MainPage class. These will be an AlgoliaClient and Index.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">private</span> <span class="n">AlgoliaClient</span> <span class="n">algoliaClient</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'><span class="k">private</span> <span class="n">Index</span> <span class="n">algoliaIndex</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, we need to instantiate these objects within the constructor. Be sure to change the application id and search only key to the ones you used in the web project.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">public</span> <span class="nf">MainPage</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="n">InitializeComponent</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="n">NavigationCacheMode</span> <span class="p">=</span> <span class="n">NavigationCacheMode</span><span class="p">.</span><span class="n">Required</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">algoliaClient</span> <span class="p">=</span> <span class="k">new</span> <span class="n">AlgoliaClient</span><span class="p">(</span><span class="s">&quot;&lt;APPLICATION_ID&gt;&quot;</span><span class="p">,</span> <span class="s">&quot;&lt;SEARCH_ONLY_API_KEY&gt;&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="n">algoliaIndex</span> <span class="p">=</span> <span class="n">algoliaClient</span><span class="p">.</span><span class="n">InitIndex</span><span class="p">(</span><span class="s">&quot;packages&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, be sure to add the necessary using statement.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">using</span> <span class="nn">Algolia.Search</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Tie it all together</h2>

<p>We now need to create a class that can be used to deserialize the Algolia search responses. Inside <code>MainPage.xaml.cs</code> create the following class. You will notice it defines Name, Link, Count, and objectID. The first 3 are fields we defined in our web application. The last one is the ID that Algolia uses in its indexed data. This is the field we mapped our models ID field to.</p>

<p>Also, you will see we are overriding <code>ToString()</code>. This is because we will be adding each <code>Hit</code> object to our AutoSuggestBox and want to control how the data is shown.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">private</span> <span class="k">class</span> <span class="nc">PackagesResult</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">class</span> <span class="nc">Hit</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">public</span> <span class="kt">string</span> <span class="n">Link</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">public</span> <span class="kt">string</span> <span class="n">Count</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">public</span> <span class="kt">string</span> <span class="n">objectID</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">public</span> <span class="k">override</span> <span class="kt">string</span> <span class="nf">ToString</span><span class="p">()</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">Name</span> <span class="p">+</span> <span class="n">Environment</span><span class="p">.</span><span class="n">NewLine</span> <span class="p">+</span>
</span><span class='line'>                <span class="s">&quot;  Link:\t&quot;</span> <span class="p">+</span> <span class="n">Link</span> <span class="p">+</span> <span class="n">Environment</span><span class="p">.</span><span class="n">NewLine</span> <span class="p">+</span>
</span><span class='line'>                <span class="s">&quot;  Count:\t&quot;</span> <span class="p">+</span> <span class="n">Count</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Hit</span><span class="p">&gt;</span> <span class="n">hits</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next we need to implement our search code each time a user enters a character in our AutoSuggestBox. Update the AutoSuggestBox event handler for TextChanged as follows.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">private</span> <span class="k">void</span> <span class="nf">AutoSuggestBox_TextChanged</span><span class="p">(</span><span class="n">AutoSuggestBox</span> <span class="n">sender</span><span class="p">,</span> <span class="n">AutoSuggestBoxTextChangedEventArgs</span> <span class="n">args</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">Reason</span> <span class="p">==</span> <span class="n">AutoSuggestionBoxTextChangeReason</span><span class="p">.</span><span class="n">UserInput</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">searchTerm</span> <span class="p">=</span> <span class="n">sender</span><span class="p">.</span><span class="n">Text</span><span class="p">;</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">query</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Query</span><span class="p">(</span><span class="n">searchTerm</span><span class="p">);</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="n">algoliaIndex</span><span class="p">.</span><span class="n">SearchAsync</span><span class="p">(</span><span class="n">query</span><span class="p">).</span><span class="n">Result</span><span class="p">;</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">packagesResult</span> <span class="p">=</span> <span class="n">result</span><span class="p">.</span><span class="n">ToObject</span><span class="p">&lt;</span><span class="n">PackagesResult</span><span class="p">&gt;();</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">sender</span><span class="p">.</span><span class="n">ItemsSource</span> <span class="p">=</span> <span class="n">packagesResult</span><span class="p">.</span><span class="n">hits</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we are doing here is creating a new Algolia Query using the entered text. We then issue a search, get back the results as JSON, and convert it to a PackagesResult object. The last thing we do is add the list of Hits as the ItemsSource of our AutoSuggestBox. This will automatically show the results to the user.</p>

<p>Finally, we need to update the SuggestionChosen event for our AutoSuggestBox when a user selects one of the results we showed them. Update it as follows.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='c#'><span class='line'><span class="k">private</span> <span class="k">void</span> <span class="nf">AutoSuggestBox_SuggestionChosen</span><span class="p">(</span><span class="n">AutoSuggestBox</span> <span class="n">sender</span><span class="p">,</span> <span class="n">AutoSuggestBoxSuggestionChosenEventArgs</span> <span class="n">args</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">hit</span> <span class="p">=</span> <span class="p">(</span><span class="n">PackagesResult</span><span class="p">.</span><span class="n">Hit</span><span class="p">)</span><span class="n">args</span><span class="p">.</span><span class="n">SelectedItem</span><span class="p">;</span>
</span><span class='line'>    <span class="n">SearchWebView</span><span class="p">.</span><span class="n">Navigate</span><span class="p">(</span><span class="k">new</span> <span class="n">Uri</span><span class="p">(</span><span class="s">&quot;http://localhost:8671/api/packages/&quot;</span> <span class="p">+</span> <span class="n">hit</span><span class="p">.</span><span class="n">objectID</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>All we are doing here is taking the selected item, reference that items object ID, and then navigating our WebView to that page. The page we are showing is the API endpoint we created in our web application. This is just a simple example of how to tie the two applications together. A more robust approach would be to process the data from the API and build a UI capable of viewing, editing, and deleting the data.</p>

<p><img src="http://scottksmith.com/images/algolia_csharp_16.png" alt="Screenshot 16" /></p>

<h3>Wrap up</h3>

<p>That wraps up this tutorial on adding Algolia to an ASP.NET MVC application along with a Windows Phone 8.1 application. There was a lot going on here, but if you take out the standard stuff for our web and phone application, the Algolia part is very simple and straightforward.</p>

<p>If you found this article or others useful be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>

<p>Source code for tutorial can be found <a href="https://github.com/algolia/tutorials/tree/master/csharp/src/PackageTrack">here on GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Twitatron: Building a production web app with Node - Views &amp; Controllers]]></title>
    <link href="http://scottksmith.com/blog/2015/03/23/twitatron-building-a-production-web-app-with-node-views-and-controllers/"/>
    <updated>2015-03-23T14:59:00-07:00</updated>
    <id>http://scottksmith.com/blog/2015/03/23/twitatron-building-a-production-web-app-with-node-views-and-controllers</id>
    <content type="html"><![CDATA[<p>Welcome to part 2 of the Twitaron series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2014/10/05/twitatron-building-a-production-web-app-with-node/">Getting started</a></li>
<li><a href="http://scottksmith.com/blog/2015/03/23/twitatron-building-a-production-web-app-with-node-views-and-controllers/">Views &amp; Controllers</a></li>
<li><a href="http://scottksmith.com/blog/2015/05/26/twitatron-building-a-production-web-app-with-node-user-accounts/">User Accounts</a></li>
<li>Under development&#8230;</li>
</ol>


<p>In our <a href="http://scottksmith.com/blog/2014/10/05/twitatron-building-a-production-web-app-with-node/">previous article</a> we started with the basics and built a web application capable of serving static content, compressing that content, and implementing cache headers.</p>

<p>In this installment of the Twitatron series, we will be diving into Views and Controllers.</p>

<h3>Getting setup</h3>

<p>Our view engine of choice will be <a href="http://jade-lang.com/reference/">Jade</a>. Jade is a terse language for writing HTML templates. It is capable of producing HTML, supports dynamic code, and supports reusability. You can find a <a href="http://jade-lang.com/tutorial/">tutorial here</a> to learn more about Jade.</p>

<p>First thing we need to do is create a directory to store our views. If you don&#8217;t already have a directory named <code>views</code> you will need to create one now.</p>

<p>We will now need to tell Express about the view engine we wish to use.</p>

<p>Open up <code>server.js</code> and update it with the following code after the static middleware code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add static middleware</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">oneDay</span> <span class="o">=</span> <span class="mi">86400000</span><span class="p">;</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="kr">static</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/public&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">maxAge</span><span class="o">:</span> <span class="nx">oneDay</span> <span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add jade view engine</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;views&#39;</span><span class="p">,</span> <span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/views&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;view engine&#39;</span><span class="p">,</span> <span class="s1">&#39;jade&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express router</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">Router</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, we need to install the <a href="https://www.npmjs.org/package/jade">Jade</a> npm package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install jade --save
</span></code></pre></td></tr></table></div></figure>


<p>What we did was add two pieces of middleware to our Express application. First, we told it to set the directory for our views to <code>/views</code>. Second, we told it to use Jade as our view engine.</p>

<p>We are now ready to create our first view.</p>

<h3>Our first view</h3>

<p>In the <code>views</code> directory create a new file named <code>home.jade</code> and add the following code to it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='jade'><span class='line'><span class="nt">doctype</span> html
</span><span class='line'><span class="nt">html</span>
</span><span class='line'>  <span class="nt">head</span>
</span><span class='line'>    <span class="nt">title</span> Twitatron
</span><span class='line'>  <span class="nt">body</span>
</span><span class='line'>    <span class="nt">h1</span> A Twitatron view has been born!
</span><span class='line'>    <span class="nt">img</span>(<span class="na">src=</span><span class="s">&quot;/img/birdatron-small.jpg&quot;</span>)
</span></code></pre></td></tr></table></div></figure>


<p>Next, we need to create a route at the root of our application to render this view. Open up <code>server.js</code> and update it with the following code. Be sure to remove the &#8220;dummy&#8221; route we made in the first tutorial that just returned the text &#8220;Twitatron&#8221;.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express router</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">Router</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Landing page route</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;home&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Register all our routes</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">router</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, because we now have a view, we do not need the <code>index.html</code> file inside our <code>public</code> directory. Go ahead and delete it.</p>

<p>What we have done is setup a new route to handle GET requests to /. When a browser requests <code>http://localhost:3000/</code> it will execute the anonymous function we defined to render the view named <code>home</code>. Because we already defined the directory for our views to be <code>views</code>, Express will look for a view named <code>home.jade</code>, render it into html, and return it back to the requesting client.</p>

<p>Go ahead and test out your code to make sure everything is working. You should get back a response with the text &#8220;A Twitatron view has been born!&#8221; along with the Twitatron bird image.</p>

<h3>Layout and partials</h3>

<p>The next thing to update in our application is to implement a layout view and some partial views. This will help us reduce a significant amount of view code through reuse.</p>

<p>The first thing we will create is our layout view. This will define the general layout of our application and will be used in most of our other views. Inside the <code>views</code> directory, create a filed named <code>layout.jade</code>. Update it with the following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='jade'><span class='line'><span class="nt">doctype</span> html
</span><span class='line'><span class="nt">html</span>
</span><span class='line'>  <span class="nt">head</span>
</span><span class='line'>    <span class="nt">title</span> Twitatron
</span><span class='line'>    <span class="nt">include</span> partials/head
</span><span class='line'>  <span class="nt">body</span>
</span><span class='line'>    <span class="nt">include</span> partials/navigation
</span><span class='line'>    <span class="nt">block</span> content
</span><span class='line'>    <span class="nt">include</span> partials/footer
</span></code></pre></td></tr></table></div></figure>


<p>You will notice that our layout contains references to 3 partial views. Let&#8217;s go ahead and create these now. First, create a sub-directory inside the <code>views</code> directory named <code>partials</code>. Next, create three new views named: <code>head.jade</code>, <code>navigation.jade</code>, and <code>footer.jade</code>. Update each one as follows.</p>

<p><strong>Head</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='jade'><span class='line'><span class="nt">meta</span>(<span class="na">charset=</span><span class="s">&#39;utf-8&#39;</span>)
</span><span class='line'><span class="nt">meta</span>(<span class="na">http-equiv=</span><span class="s">&#39;X-UA-Compatible&#39;</span><span class="err">,</span> <span class="na">content=</span><span class="s">&#39;IE=edge&#39;</span>)
</span><span class='line'><span class="nt">meta</span>(<span class="na">name=</span><span class="s">&#39;viewport&#39;</span><span class="err">,</span> <span class="na">content=</span><span class="s">&#39;width=device-width, initial-scale=1.0&#39;</span>)
</span><span class='line'><span class="nt">meta</span>(<span class="na">name=</span><span class="s">&#39;description&#39;</span><span class="err">,</span> <span class="na">content=</span><span class="s">&#39;Automatically monitor your Twitter account for mentions.&#39;</span>)
</span><span class='line'><span class="nt">meta</span>(<span class="na">name=</span><span class="s">&#39;keywords&#39;</span> <span class="na">content=</span><span class="s">&#39;twitter, mentions, api, rss, email, storage, bookmark&#39;</span>)
</span><span class='line'><span class="nt">meta</span>(<span class="na">name=</span><span class="s">&#39;csrf-token&#39;</span><span class="err">,</span> <span class="na">content=</span><span class="nv">_csrf</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;apple-touch-icon&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;57x57&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/apple-touch-icon-57x57.png&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;apple-touch-icon&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;114x114&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/apple-touch-icon-114x114.png&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;apple-touch-icon&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;72x72&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/apple-touch-icon-72x72.png&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;apple-touch-icon&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;144x144&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/apple-touch-icon-144x144.png&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;apple-touch-icon&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;60x60&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/apple-touch-icon-60x60.png&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;apple-touch-icon&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;120x120&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/apple-touch-icon-120x120.png&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;apple-touch-icon&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;76x76&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/apple-touch-icon-76x76.png&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;apple-touch-icon&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;152x152&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/apple-touch-icon-152x152.png&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;icon&#39;</span> <span class="na">type=</span><span class="s">&#39;image/png&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/favicon-196x196.png&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;196x196&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;icon&#39;</span> <span class="na">type=</span><span class="s">&#39;image/png&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/favicon-160x160.png&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;160x160&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;icon&#39;</span> <span class="na">type=</span><span class="s">&#39;image/png&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/favicon-96x96.png&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;96x96&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;icon&#39;</span> <span class="na">type=</span><span class="s">&#39;image/png&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/favicon-16x16.png&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;16x16&#39;</span>)
</span><span class='line'><span class="nt">link</span>(<span class="na">rel=</span><span class="s">&#39;icon&#39;</span> <span class="na">type=</span><span class="s">&#39;image/png&#39;</span><span class="err">,</span> <span class="na">href=</span><span class="s">&#39;/favicon-32x32.png&#39;</span><span class="err">,</span> <span class="na">sizes=</span><span class="s">&#39;32x32&#39;</span>)
</span><span class='line'><span class="nt">meta</span>(<span class="na">name=</span><span class="s">&#39;msapplication-TileColor&#39;</span> <span class="na">content=</span><span class="s">&#39;#9f00a7&#39;</span>)
</span><span class='line'><span class="nt">meta</span>(<span class="na">name=</span><span class="s">&#39;msapplication-TileImage&#39;</span> <span class="na">content=</span><span class="s">&#39;/mstile-144x144.png&#39;</span>)
</span></code></pre></td></tr></table></div></figure>


<p>This view contains all our information for the head section of our HTML. Right now there are references to many icons for our application that do not yet exist. Don&#8217;t worry about that for now as we will be making these in future tutorials.</p>

<p><strong>Navigation</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='jade'><span class='line'><span class="nt">header</span>
</span><span class='line'>  <span class="nt">div</span>
</span><span class='line'>    <span class="nt">a</span>(<span class="na">href=</span><span class="s">&#39;/&#39;</span>) Twitatron
</span></code></pre></td></tr></table></div></figure>


<p>Pretty simple navigation piece for now. This will become more robust as we progress through the series.</p>

<p><strong>Footer</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='jade'><span class='line'><span class="nt">footer</span>
</span><span class='line'>  <span class="nt">div</span>
</span><span class='line'>    <span class="nt">small</span> &amp;copy; Twitatron 2015
</span><span class='line'>    <span class="nt">small</span> Created by
</span><span class='line'>      <span class="nt">a</span>(<span class="na">href=</span><span class="s">&quot;http://scottksmith.com&quot;</span><span class="err">,</span> <span class="na">target=</span><span class="s">&quot;_blank&quot;</span>) Scott Smith
</span></code></pre></td></tr></table></div></figure>


<p>The last thing we need to do is update our current view for the homepage to use the new layout view. Update <code>home.jade</code> with the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='jade'><span class='line'><span class="nt">extends</span> layout
</span><span class='line'>
</span><span class='line'><span class="nt">block</span> content
</span><span class='line'>  <span class="nt">h1</span> A Twitatron view has been born!
</span><span class='line'>  <span class="nt">img</span>(<span class="na">src=</span><span class="s">&quot;/img/birdatron-small.jpg&quot;</span>)
</span></code></pre></td></tr></table></div></figure>


<p>Our view now says to extend our layout view and use the content defined within the content block within the block content section in the layout.</p>

<p>Now, all future views we create can extend the layout view and thus provide a head section, navigation, and footer. Later we will update our layout to add things like CSS, JavaScript, and more.</p>

<h3>Adding some dynamic code</h3>

<p>By themselves, views are helpful but they are much more powerful when you support dynamic code. This can be done easily taking advantage of Express. Let&#8217;s go ahead and add a new element to our view that shows the IP address of the person making the request to our page.</p>

<p>Open up <code>server.js</code> and update our route handler as follows.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Landing page route</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">locals</span><span class="p">.</span><span class="nx">ip</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">ip</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;home&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>What this does is add the IP address of the client making the request to the <code>res.locals.ip</code> object which makes it available to our views. The <code>res.locals</code> object is where you can add anything you want available in views.</p>

<p>Next, update <code>home.jade</code> as follows with a new element.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='jade'><span class='line'><span class="nt">extends</span> layout
</span><span class='line'>
</span><span class='line'><span class="nt">block</span> content
</span><span class='line'>  <span class="nt">h1</span> A Twitatron view has been born!
</span><span class='line'>  <span class="nt">h2</span> You are visiting from <span class="si">#{</span><span class="n">ip</span><span class="si">}</span>
</span><span class='line'>  <span class="nt">img</span>(<span class="na">src=</span><span class="s">&quot;/img/birdatron-small.jpg&quot;</span>)
</span></code></pre></td></tr></table></div></figure>


<p>This example is more to illustrate how to add dynamic code to your view from within your application. In future articles, we will dive more deeply into how to take advantage of this.</p>

<h3>Controllers</h3>

<p>The next thing we need to help make our application easier to understand and maintain are controllers. As our application grows, our route handlers will increase in quantity and complexity. We will do this by pulling out most functionality and placing them within separate modules.</p>

<p>Let&#8217;s start by updating the current route handler for we have the the root of our application.</p>

<p>If you don&#8217;t already have a directory named <code>controllers</code> you will need to create one now. Inside this folder, create a new file named <code>home.js</code> and update it with the following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">index</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">locals</span><span class="p">.</span><span class="nx">ip</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">ip</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;home&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we have done is put our route handler code into a separate home controller module. Now we just need to update <code>server.js</code> to import the module and use it. Update <code>server.js</code>with the following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">compression</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;compression&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Load controllers</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">homeController</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./controllers/home&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Landing page route</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="nx">homeController</span><span class="p">.</span><span class="nx">index</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>It may not seem like much now, but this type of pattern will help our application as we add a lot more functionality.</p>

<h3>Using path to normalize paths</h3>

<p>In two places, we have referenced the local file system using the <code>__dirname</code> global and a directory. To make our code more robust, we will take advantage of the core Node module <code>path</code>. The <code>path</code> module provides the function <code>join</code> that will join all the arguments into a normalized path.</p>

<p>For example, the following code would result in the path <code>/Users/scott/Projects/twitatron/public</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">&#39;public&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Update the two places within <code>server.js</code> where we are using the <code>dirname</code> global to use the <code>path</code> module.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">//Old</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="kr">static</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/public&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">maxAge</span><span class="o">:</span> <span class="nx">oneDay</span> <span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//New</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="kr">static</span><span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">&#39;public&#39;</span><span class="p">),</span> <span class="p">{</span> <span class="nx">maxAge</span><span class="o">:</span> <span class="nx">oneDay</span> <span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Old</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;views&#39;</span><span class="p">,</span> <span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/views&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//New</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;views&#39;</span><span class="p">,</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">&#39;views&#39;</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Wrap up</h3>

<p>While our application may not yet be pretty, we have a solid base to build and grow from. We have views, layouts, partials, controllers, and more. Stay tuned for more articles on this tutorial series on building production ready Node web applications.</p>

<p>If you found this article or others useful be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>

<p>Source code for this part can be found <a href="https://github.com/scottksmith95/twitatron/tree/master/02">here on GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[5 Fantastic &amp; Free Screencast Sites For Node Developers]]></title>
    <link href="http://scottksmith.com/blog/2015/02/26/5-fantastic-and-free-screencast-sites-for-node-developers/"/>
    <updated>2015-02-26T06:47:00-08:00</updated>
    <id>http://scottksmith.com/blog/2015/02/26/5-fantastic-and-free-screencast-sites-for-node-developers</id>
    <content type="html"><![CDATA[<p>While learning and working in Node, screencasts have been very beneficial. Over time I have come across many sites offering videos. Here is a list of my current top 5 every Node developer should know about.</p>

<h3>KnowThen</h3>

<p><a href="https://twitter.com/uknowthen">James Moore</a>, a personal friend of mine, is the newest kid on the block with KnowThen. He created the site to challenge himself to become a better instructor while at the same time creating quality videos for the community. What I really like about KnowThen is how it brings a fresh new look at Node.js by focusing on the bleeding edge. You will find videos on topics such as io.js, JSON Web Tokens, Koajs, Marko, and Generators to name a few.</p>

<p><a href="http://knowthen.com/">http://knowthen.com/</a></p>

<h3>Node Tuts</h3>

<p>After a bit of a hiatus, Node Tuts by <a href="https://twitter.com/yldio">YLD</a> is back and planning to start adding more videos to their site. Node Tuts was born back in the early days of Node (version 0.1) because there weren&#8217;t many resources around to learn from. There are currently four series to learn from: asynchronous, TCP servers, HTTP API servers, and tools, tips, &amp; tricks.</p>

<p><a href="http://nodetuts.com/">http://nodetuts.com/</a></p>

<h3>Tagtree</h3>

<p>Tagtree, created by <a href="https://twitter.com/hendrikswan">Hendrik Swanepoel</a>, is focused on growing your full stack JavaScript skills. While not solely focused on Node.js, Tagtree brings fantastic screencasts along with some courses on topics such as Node streams, Express, promises, REST APIs, ES6, and lots more.</p>

<p><a href="http://tagtree.tv/">http://tagtree.tv/</a></p>

<h3>Learn All The Nodes</h3>

<p>An oldie but goodie, Learn All The Nodes by <a href="https://twitter.com/bigohstudios">Big-Oh Studios</a> has been around since 2013. Their series are about sharing the things they learn and love. Their videos focus more on short demonstrations of useful tips, tricks, and packages.</p>

<p><a href="http://www.learnallthenodes.com/">http://www.learnallthenodes.com/</a></p>

<h3>StrongLoop</h3>

<p><a href="https://twitter.com/StrongLoop">StrongLoop</a>, whose focus is to deliver expertise and software solutions to help developers be successful with their Node projects, has a great set of videos available to learn from. They currently have over 30 videos focusing on topics such as clustering, performance, debugging, web frameworks, and more.</p>

<p><a href="http://strongloop.com/node-js/videos/">http://strongloop.com/node-js/videos/</a></p>

<h3>Have Favorites of your Own?</h3>

<p>If you have any favorites of you own, please share them in the comments. I am always looking to find more resources for myself and to share with others.</p>

<p>If you found this article or others useful be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Algolia Real Time Search With Firebase]]></title>
    <link href="http://scottksmith.com/blog/2014/12/09/algolia-real-time-search-with-firebase/"/>
    <updated>2014-12-09T16:17:00-08:00</updated>
    <id>http://scottksmith.com/blog/2014/12/09/algolia-real-time-search-with-firebase</id>
    <content type="html"><![CDATA[<p>One key feature of <a href="https://www.firebase.com/">Firebase</a> is building realtime applications by using their backend to store and sync data. Algolia further enhances that by providing realtime search capabilities. In a few simple steps, this tutorial will teach you how to import your existing data, index new data as it is added to Firebase, and remove indexed data when it is removed from Firebase.</p>

<p>Algolia&#8217;s <a href="https://github.com/algolia/algoliasearch-client-js">Node.js client</a> simplifies the integration of your Firebase applications with Algolia&#8217;s real time search service. The module makes it easy for you to use Algolia&#8217;s search capabilities in a manner that will be familiar to those already developing Firebase and Node.js applications.</p>

<h2>Prerequisites</h2>

<h3>Familiar with Firebase</h3>

<p>This tutorial assumes you are familiar with Firebase, how it works, and how to build Firebase applications. If you would like to learn more before continuing with this tutorial, I suggest reading the following documentation and tutorials:</p>

<ol>
<li><a href="https://www.firebase.com/how-it-works.html">Getting started</a></li>
<li><a href="https://www.firebase.com/docs/web/quickstart.html">Quickstart web tutorial</a></li>
<li><a href="https://www.firebase.com/docs/web/guide/">Web development guide</a></li>
</ol>


<h2>Create a Node.js Application</h2>

<p>In order to index your Firebase data and continually add/update index information, you will need to create a Node.js application. This application will be responsible for getting data out of Firebase and indexing it with Algolia. It can then be run anywhere like Heroku, Nodejitsu, AWS, Azure, etc.</p>

<p>In this tutorial, we will be indexing contact information in a Firebase application. Be sure to change &#8216;YourApplicationID&#8217; and &#8216;YourAPIKey&#8217; to your account values <a href="https://www.algolia.com/licensing">here</a>. Because we are making calls that require more than read access, you will need to create a new key or use an existing one that can Add Records, Delete Records, and Delete Index (for reindexing example). You will also need to set your Firebase &#8216;INSTANCE&#8217; to the one your application uses.</p>

<p>Here is the intial portion of the Node.js application.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Firebase</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;firebase&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">algoliasearch</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;algoliasearch&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;YourApplicationID&#39;</span><span class="p">,</span> <span class="s1">&#39;YourAPIKey&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;contacts&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Connect to our Firebase contacts data</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">fb</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Firebase</span><span class="p">(</span><span class="s1">&#39;&lt;INSTANCE&gt;.firebaseio.com/contacts&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Be sure to install the necessary packages so your application will run.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install firebase --save
</span><span class='line'>npm install algoliasearch --save
</span></code></pre></td></tr></table></div></figure>


<h2>Import Existing Data</h2>

<p>In many cases, you may already have data within your Firebase application. In order to integrate with Algolia, you will want to index that data. We will use contact information being stored within Firebaseio as our example. Add the following code to your Node.js application.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Get all data from Firebase</span>
</span><span class='line'><span class="nx">fb</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="nx">initIndex</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">initIndex</span><span class="p">(</span><span class="nx">dataSnapshot</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Array of data to index</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">objectsToIndex</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Get all objects</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">values</span> <span class="o">=</span> <span class="nx">dataSnapshot</span><span class="p">.</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Process each Firebase ojbect</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">key</span> <span class="k">in</span> <span class="nx">values</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">values</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Get current Firebase object</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">firebaseObject</span> <span class="o">=</span> <span class="nx">values</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Specify Algolia&#39;s objectID using the Firebase object key</span>
</span><span class='line'>      <span class="nx">firebaseObject</span><span class="p">.</span><span class="nx">objectID</span> <span class="o">=</span> <span class="nx">key</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Add object for indexing</span>
</span><span class='line'>      <span class="nx">objectsToIndex</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">firebaseObject</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Add or update new objects</span>
</span><span class='line'>  <span class="nx">index</span><span class="p">.</span><span class="nx">saveObjects</span><span class="p">(</span><span class="nx">objectsToIndex</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Firebase&lt;&gt;Algolia import done&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>To ensure the indexing performs well it is suggested you limit the number of items indexed per call between 1,000 and 10,000 depending on the object size.</p>

<p>Once you run this code, you will have all of your existing Firebase data indexed with Algolia. You will want to remove this code once is is done because the event will continue to fire each time data is added.</p>

<h2>Reindex Data</h2>

<p>Sometimes, you may have the need to completely reindex your data. This means removing data from the index that may not longer exist, adding new data, and updating existing data. The following code can be added to the Node.js application to perform a reindexing. You will want to remove or comment out the initial index code if currently present.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Get all data from Firebase</span>
</span><span class='line'><span class="nx">fb</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="nx">reindexIndex</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">reindexIndex</span><span class="p">(</span><span class="nx">dataSnapshot</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Array of objects to index</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">objectsToIndex</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Create a temp index</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">tempIndexName</span> <span class="o">=</span> <span class="s1">&#39;contacts_temp&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">tempIndex</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="nx">tempIndexName</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Get all objects</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">values</span> <span class="o">=</span> <span class="nx">dataSnapshot</span><span class="p">.</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Process each Firebase object</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">key</span> <span class="k">in</span> <span class="nx">values</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">values</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Get current Firebase object</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">firebaseObject</span> <span class="o">=</span> <span class="nx">values</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Specify Algolia&#39;s objectID using the Firebase object key</span>
</span><span class='line'>      <span class="nx">firebaseObject</span><span class="p">.</span><span class="nx">objectID</span> <span class="o">=</span> <span class="nx">key</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Add object for indexing</span>
</span><span class='line'>      <span class="nx">objectsToIndex</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">firebaseObject</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Add or update new objects</span>
</span><span class='line'>  <span class="nx">index</span><span class="p">.</span><span class="nx">saveObjects</span><span class="p">(</span><span class="nx">objectsToIndex</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Overwrite main index with temp index</span>
</span><span class='line'>    <span class="nx">client</span><span class="p">.</span><span class="nx">moveIndex</span><span class="p">(</span><span class="nx">tempIndexName</span><span class="p">,</span> <span class="s1">&#39;contacts&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Firebase&lt;&gt;Algolia reimport done&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>To ensure the reindexing performs well it is suggested you limit the number of items indexed per call between 1,000 and 10,000 depending on the object size.</p>

<p>Once you run this code, you will have all of your existing Firebase data reindexed with Algolia. You will want to remove this code once is is done because the event will continue to fire each time data is added.</p>

<h2>Add or Update Data</h2>

<p>Now, we need to handle the case where data is being added or updated. We can easily setup our code to automatically add or update data to our search index by attaching to the &#8216;child_added&#8217; and &#8216;child_changed&#8217; events. This will allow us to define code that will be called after data is stored in Firebase. Add the following code to your Node.js application.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Listen for changes to Firebase data</span>
</span><span class='line'><span class="nx">fb</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;child_added&#39;</span><span class="p">,</span> <span class="nx">addOrUpdateObject</span><span class="p">);</span>
</span><span class='line'><span class="nx">fb</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;child_changed&#39;</span><span class="p">,</span> <span class="nx">addOrUpdateObject</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">addOrUpdateObject</span><span class="p">(</span><span class="nx">dataSnapshot</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Get Firebase object</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">firebaseObject</span> <span class="o">=</span> <span class="nx">dataSnapshot</span><span class="p">.</span><span class="nx">val</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Specify Algolia&#39;s objectID using the Firebase object key</span>
</span><span class='line'>  <span class="nx">firebaseObject</span><span class="p">.</span><span class="nx">objectID</span> <span class="o">=</span> <span class="nx">dataSnapshot</span><span class="p">.</span><span class="nx">key</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Add or update object</span>
</span><span class='line'>  <span class="nx">index</span><span class="p">.</span><span class="nx">saveObject</span><span class="p">(</span><span class="nx">firebaseObject</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Firebase&lt;&gt;Algolia object saved&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, whenever contact data is saved in Firebase, it will automatically be indexed with Algolia.</p>

<h2>Delete Data</h2>

<p>Next, we need to handle the case where data is deleted from your Firebase application. In order to do this, we can attach to the &#8216;child_removed&#8217; event. This will allow us to define code that will be called after data is removed from Firebase. Add the following code to your Node.js application.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Listen for changes to Firebase data</span>
</span><span class='line'><span class="nx">fb</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;child_removed&#39;</span><span class="p">,</span> <span class="nx">removeIndex</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">removeIndex</span><span class="p">(</span><span class="nx">dataSnapshot</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Get Algolia&#39;s objectID from the Firebase object key</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">objectID</span> <span class="o">=</span> <span class="nx">dataSnapshot</span><span class="p">.</span><span class="nx">key</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Remove the object from Algolia</span>
</span><span class='line'>  <span class="nx">index</span><span class="p">.</span><span class="nx">deleteObject</span><span class="p">(</span><span class="nx">objectID</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Firebase&lt;&gt;Algolia object deleted&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, whenever contact data is removed from Firebase, it will automatically get removed from Algolia.</p>

<h2>Next Steps</h2>

<ol>
<li><a href="https://www.algolia.com/doc/node">Read the Node.js documentation</a></li>
<li><a href="https://github.com/algolia/algoliasearch-client-node#commands-reference">Dive into the Node.js command reference</a></li>
<li><a href="https://github.com/algolia/algoliasearch-client-node">Explore the Node.js API client source code</a></li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Algolia Real Time Search With Parse]]></title>
    <link href="http://scottksmith.com/blog/2014/12/08/algolia-real-time-search-with-parse/"/>
    <updated>2014-12-08T08:42:00-08:00</updated>
    <id>http://scottksmith.com/blog/2014/12/08/algolia-real-time-search-with-parse</id>
    <content type="html"><![CDATA[<p>One key feature of <a href="https://parse.com/">Parse</a> is for applications to use Parse Core as their data store. In a few simple steps, this tutorial will teach you how to import your existing data, index new data as it is added to Parse, and remove indexed data when it is removed from Parse.</p>

<p>The <a href="https://github.com/algolia/algoliasearch-client-js#parsecom">Algolia Parse Module</a> simplifies the integration of your Parse based applications with Algolia&#8217;s real time search service. The module makes it easy for you to use Algolia&#8217;s search capabilities in a manner that will be familiar to those already using the Algolia Node.js client APIs.</p>

<h2>Prerequisites</h2>

<h3>Familiar with Parse</h3>

<p>This tutorial assumes you are familiar with Parse, how it works, and how to build Cloud Code applications. If you would like to learn more before continuing with this tutorial, I suggest reading the following documentation and tutorials:</p>

<ol>
<li><a href="https://parse.com/docs/cloud_code_guide#started">Getting started with Cloud Code</a></li>
<li><a href="https://parse.com/apps/quickstart#parse_data/web/new">Parse quickstart web project</a></li>
<li><a href="https://parse.com/apps/quickstart#cloud_code/unix">Parse quickstart Cloud Code project on Mac/Linux</a></li>
<li><a href="https://parse.com/apps/quickstart#cloud_code/windows">Parse quickstart Cloud Code project on Windows</a></li>
</ol>


<h2>Add Agolia Real Time Search to the Project</h2>

<p>In order to integrate Aloglia within your Parse application, you will need to add the Algolia Node.js client. Copy <a href="https://raw.githubusercontent.com/algolia/algoliasearch-client-js/master/dist/algoliasearch.parse.js">algoliasearch.parse.js</a> to <code>cloud/algoliasearch.parse.js</code> within your Parse Cloud Code directory.</p>

<h2>Import Existing Data</h2>

<p>In many cases, you may already have data within your Parse application. In order to integrate with Algolia, you will want to index that data. We will use contact information being stored within Parse as our example.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">algoliasearch</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;cloud/algoliasearch.parse.js&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;YourApplicationID&#39;</span><span class="p">,</span> <span class="s1">&#39;YourAPIKey&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;contacts&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">indexData</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">objectsToIndex</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//Create a new query for Contacts</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">query</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Parse</span><span class="p">.</span><span class="nx">Query</span><span class="p">(</span><span class="s1">&#39;Contact&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Find all items</span>
</span><span class='line'>  <span class="nx">query</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">contacts</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// prepare objects to index from contacts</span>
</span><span class='line'>      <span class="nx">objectsToIndex</span> <span class="o">=</span> <span class="nx">contacts</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">contact</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// convert to regular key/value JavaScript object</span>
</span><span class='line'>        <span class="nx">contact</span> <span class="o">=</span> <span class="nx">contact</span><span class="p">.</span><span class="nx">toJSON</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Specify Algolia&#39;s objectID with the Parse.Object unique ID</span>
</span><span class='line'>        <span class="nx">contact</span><span class="p">.</span><span class="nx">objectID</span> <span class="o">=</span> <span class="nx">contact</span><span class="p">.</span><span class="nx">objectId</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nx">contact</span><span class="p">;</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Add or update new objects</span>
</span><span class='line'>      <span class="nx">index</span><span class="p">.</span><span class="nx">saveObjects</span><span class="p">(</span><span class="nx">objectsToIndex</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Parse&lt;&gt;Algolia import done&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">error</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can now use this function within your own Parse Cloud Code functions in order to index your existing data.</p>

<p>Be sure to change &#8216;YourApplicationID&#8217; and &#8216;YourAPIKey&#8217; to your account values <a href="https://www.algolia.com/licensing">here</a>. Because we are making calls that require more than read access, you will need to create a new key or use an existing one that can Add Records, Delete Records, and Delete Index (for reindexing example). If you create a new key, you will need to make sure it can Add Records and Delete Records.</p>

<h2>Reindex Data</h2>

<p>Sometimes, you may have the need to completely reindex your data. This means removing data from the index that may not longer exist, adding new data, and updating existing data. The following code can be used within your own Parse Cloud Code functions to perform a reindexing.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">tempIndexName</span> <span class="o">=</span> <span class="s1">&#39;contacts_temp&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mainIndexName</span> <span class="o">=</span> <span class="s1">&#39;contacts&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">algoliasearch</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;cloud/algoliasearch.parse.js&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;YourApplicationID&#39;</span><span class="p">,</span> <span class="s1">&#39;YourAPIKey&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">tempIndex</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="nx">tempIndexName</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">reindexData</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">objectsToIndex</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Create a temp index</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">tempIndex</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="nx">tempIndexName</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Create a new query for Contacts</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">query</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Parse</span><span class="p">.</span><span class="nx">Query</span><span class="p">(</span><span class="s1">&#39;Contact&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Find all items</span>
</span><span class='line'>  <span class="nx">query</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">contacts</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// prepare objects to index from contacts</span>
</span><span class='line'>      <span class="nx">objectsToIndex</span> <span class="o">=</span> <span class="nx">contacts</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">contact</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// convert to regular key/value JavaScript object</span>
</span><span class='line'>        <span class="nx">contact</span> <span class="o">=</span> <span class="nx">contact</span><span class="p">.</span><span class="nx">toJSON</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Specify Algolia&#39;s objectID with the Parse.Object unique ID</span>
</span><span class='line'>        <span class="nx">contact</span><span class="p">.</span><span class="nx">objectID</span> <span class="o">=</span> <span class="nx">contact</span><span class="p">.</span><span class="nx">objectId</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nx">contact</span><span class="p">;</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Add new objects to temp index</span>
</span><span class='line'>      <span class="nx">tempIndex</span><span class="p">.</span><span class="nx">saveObjects</span><span class="p">(</span><span class="nx">objectsToIndex</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Overwrite main index with temp index</span>
</span><span class='line'>        <span class="nx">client</span><span class="p">.</span><span class="nx">moveIndex</span><span class="p">(</span><span class="nx">tempIndexName</span><span class="p">,</span> <span class="nx">mainIndexName</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Parse&lt;&gt;Algolia reimport done&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="nx">error</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Add or Update Data</h2>

<p>Now, we need to handle the case where data is being added or updated. We can easily setup our code to automatically add or update data to our search index by using the <code>afterSave</code> Parse function. This will allow us to define code that will be called after data is stored in Parse.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">algoliasearch</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;cloud/algoliasearch.parse.js&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;YourApplicationID&#39;</span><span class="p">,</span> <span class="s1">&#39;YourAPIKey&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;contacts&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Parse</span><span class="p">.</span><span class="nx">Cloud</span><span class="p">.</span><span class="nx">afterSave</span><span class="p">(</span><span class="s1">&#39;Contact&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">request</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Convert Parse.Object to JSON</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">objectToSave</span> <span class="o">=</span> <span class="nx">request</span><span class="p">.</span><span class="nx">object</span><span class="p">.</span><span class="nx">toJSON</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Specify Algolia&#39;s objectID with the Parse.Object unique ID</span>
</span><span class='line'>  <span class="nx">objectToSave</span><span class="p">.</span><span class="nx">objectID</span> <span class="o">=</span> <span class="nx">objectToSave</span><span class="p">.</span><span class="nx">objectId</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Add or update object</span>
</span><span class='line'>  <span class="nx">index</span><span class="p">.</span><span class="nx">saveObject</span><span class="p">(</span><span class="nx">objectToSave</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Parse&lt;&gt;Algolia object saved&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, whenever contact data is saved in Parse, it will automatically be indexed with Algolia.</p>

<h2>Delete Data</h2>

<p>Next, we need to handle the case where data is deleted from your Parse application. In order to do this, we can use the <code>afterDelete</code> Parse function. This will allow us to define code that will be called after data is removed from Parse.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">algoliasearch</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;cloud/algoliasearch.parse.js&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;YourApplicationID&#39;</span><span class="p">,</span> <span class="s1">&#39;YourAPIKey&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;contacts&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Parse</span><span class="p">.</span><span class="nx">Cloud</span><span class="p">.</span><span class="nx">afterDelete</span><span class="p">(</span><span class="s1">&#39;Contact&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">request</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Get Algolia objectID</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">objectID</span> <span class="o">=</span> <span class="nx">request</span><span class="p">.</span><span class="nx">object</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Remove the object from Algolia</span>
</span><span class='line'>  <span class="nx">index</span><span class="p">.</span><span class="nx">deleteObject</span><span class="p">(</span><span class="nx">objectID</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Parse&lt;&gt;Algolia object deleted&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, whenever contact data is removed from Parse, it will automatically get removed from Algolia.</p>

<h2>Next Steps</h2>

<ol>
<li><a href="https://www.algolia.com/doc/node">Read the Node.js documentation</a></li>
<li><a href="https://github.com/algolia/algoliasearch-client-node#commands-reference">Dive into the Node.js command reference</a></li>
<li><a href="https://github.com/algolia/algoliasearch-client-node">Explore the Node.js API client source code</a></li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Algolia Real Time Search with Twitter typeahead.js]]></title>
    <link href="http://scottksmith.com/blog/2014/10/29/algolia-real-time-search-with-twitters-typeaheadjs/"/>
    <updated>2014-10-29T11:35:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/10/29/algolia-real-time-search-with-twitters-typeaheadjs</id>
    <content type="html"><![CDATA[<p><img src="http://scottksmith.com/images/Algolia_logo2.png" alt="Algolia Logo" /></p>

<p>In our <a href="http://scottksmith.com/blog/2014/10/21/getting-started-with-algolia-real-time-search/">previous article</a> we learned how to easily add <a href="https://www.algolia.com">Algolia&#8217;s real time search</a> to our web application. We kept it simple and showed the results in a functional but not very pretty result list.</p>

<p>In this article, we will see how to quickly and easily add some awesomesauce to our application by integrating our search results with Twitter&#8217;s <a href="https://github.com/twitter/typeahead.js">typeahead.js</a>. If you haven&#8217;t read the <a href="http://scottksmith.com/blog/2014/10/21/getting-started-with-algolia-real-time-search/">previous article</a>, you will want to so you can create your Algolia account and initial data index which will be used in this article.</p>

<h3>Initial code</h3>

<p>To help start this tutorial, we will start with a basic application structure. Create the following directory structure and files.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>user-search-typeahead/
</span><span class='line'>  css/
</span><span class='line'>    styles.css
</span><span class='line'>  js/
</span><span class='line'>    main.js
</span><span class='line'>  index.html</span></code></pre></td></tr></table></div></figure>


<p>Add the following code to <code>index.html</code>, <code>styles.css</code>, and <code>main.js</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html</span> <span class="na">lang=</span><span class="s">&quot;en&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;title&gt;</span>Algolia | User Search with typeahead.js<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>  <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">type=</span><span class="s">&quot;text/css&quot;</span> <span class="na">href=</span><span class="s">&quot;/css/styles.css&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;search&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;h1&gt;</span>Search users in real time with typeahead.js<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">id=</span><span class="s">&quot;typeahead-algolia&quot;</span> <span class="na">class=</span><span class="s">&quot;typeahead&quot;</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;//cdn.jsdelivr.net/jquery/2.1.3/jquery.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;//cdn.jsdelivr.net/algoliasearch/3/algoliasearch.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;/js/main.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nc">.typeahead</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">300px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">font-size</span><span class="o">:</span> <span class="m">24px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">line-height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;&lt;APPLICATION ID&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;SEARCH-ONLY API KEY&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;&lt;INDEX NAME&gt;&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>You will need to update the JavaScript file and set your own application id, search-only api key, and index name. These will be the same ones you used for the previous tutorial we did.</p>

<h3>Algolia&#8217;s support for Twitter typeahead.js</h3>

<p>One of the many nice things about Algolia&#8217;s APIs is the built in adapter for Twitter typeahead.js.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm"> * Get a Typeahead.js adapter</span>
</span><span class='line'><span class="cm"> * @param searchParams contains an object with query parameters (see search for details)</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'><span class="nx">ttAdapter</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">query</span><span class="p">,</span> <span class="nx">cb</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">self</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="nx">query</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">success</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">success</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">cb</span><span class="p">(</span><span class="nx">content</span><span class="p">.</span><span class="nx">hits</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">},</span> <span class="nx">params</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This adapter makes it very simple to hook into typeahead.js functionality for building beautiful auto complete UI components. In essence it is building the necessary hooks to automatically initiate a search and return the results as a user types within the typeahead.js component.</p>

<h3>Add typeahead.js to our application</h3>

<p>In order to add typeahead.js to our application, we need to include the script. In the <code>index.html</code> file, add the following typeahead.js script tag just before the Algolia script tag.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;https://cdn.jsdelivr.net/typeahead.js/0.10.5/typeahead.jquery.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that we have the necessary scripts, we can tie the typeahead.js functionality with our Algolia search code. Update <code>main.js</code> to look like the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;&lt;APPLICATION ID&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;SEARCH-ONLY API KEY&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;&lt;INDEX NAME&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#typeahead-algolia&#39;</span><span class="p">).</span><span class="nx">typeahead</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">source</span><span class="o">:</span> <span class="nx">index</span><span class="p">.</span><span class="nx">ttAdapter</span><span class="p">({</span> <span class="s2">&quot;hitsPerPage&quot;</span><span class="o">:</span> <span class="mi">10</span> <span class="p">}),</span>
</span><span class='line'>    <span class="nx">displayKey</span><span class="o">:</span> <span class="s1">&#39;name&#39;</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>So that is all we need in order to have nice type ahead/auto complete functionality tied to our Algolia real time search. What is happening here is as we type in the input field, the typeahead component is firing off searches using the <code>ttAdapter</code> we hooked in as the source. As results come back, the typeahead component pulls out the <code>name</code> field from each <code>hit</code> and shows that in the dropdown.</p>

<h3>Make it a little prettier</h3>

<p>Some final touches will be to make the results look a little nicer with some CSS. Open up <code>styles.css</code> and update it to the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nc">.typeahead</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">300px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">font-size</span><span class="o">:</span> <span class="m">24px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">line-height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-input</span><span class="o">,</span>
</span><span class='line'><span class="nc">.tt-hint</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">396px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">8px</span> <span class="m">12px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">font-size</span><span class="o">:</span> <span class="m">24px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">line-height</span><span class="o">:</span> <span class="m">30px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">2px</span> <span class="k">solid</span> <span class="m">#ccc</span><span class="p">;</span>
</span><span class='line'>  <span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">8px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">outline</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-input</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="k">inset</span> <span class="m">0</span> <span class="m">1px</span> <span class="m">1px</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">.</span><span class="m">075</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-hint</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">color</span><span class="o">:</span> <span class="m">#999</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-dropdown-menu</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">422px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">margin-top</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">8px</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">background-color</span><span class="o">:</span> <span class="m">#fff</span><span class="p">;</span>
</span><span class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="m">#ccc</span><span class="p">;</span>
</span><span class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">.</span><span class="m">2</span><span class="p">);</span>
</span><span class='line'>  <span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">8px</span><span class="p">;</span>
</span><span class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="m">0</span> <span class="m">5px</span> <span class="m">10px</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span><span class="m">0</span><span class="o">,</span><span class="m">0</span><span class="o">,.</span><span class="m">2</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-suggestion</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">3px</span> <span class="m">20px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">font-size</span><span class="o">:</span> <span class="m">18px</span><span class="p">;</span>
</span><span class='line'>  <span class="k">line-height</span><span class="o">:</span> <span class="m">24px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-suggestion.tt-cursor</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">color</span><span class="o">:</span> <span class="m">#fff</span><span class="p">;</span>
</span><span class='line'>  <span class="k">background-color</span><span class="o">:</span> <span class="m">#0097cf</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-suggestion</span> <span class="nt">p</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.tt-suggestion</span> <span class="nt">em</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">font-weight</span><span class="o">:</span> <span class="k">bold</span><span class="p">;</span>
</span><span class='line'>  <span class="k">font-style</span><span class="o">:</span> <span class="k">normal</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.name</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">font-weight</span><span class="o">:</span> <span class="k">bold</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.attribute</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">margin-left</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Your results should look like this now if everything was done correctly.</p>

<p><img src="http://scottksmith.com/images/Algolia_typeahead.png" alt="Algolia Typeahead Example" /></p>

<h3>Customize our typeahead.js options</h3>

<p>There are three options we can control when setting up typeahead.js.</p>

<ol>
<li>highlight - If true, when suggestions are rendered, pattern matches for the current query in text nodes will be wrapped in a strong element with tt-highlight class. Defaults to false.</li>
<li>hint - If false, the typeahead will not show a hint. Defaults to true.</li>
<li>minLength - The minimum character length needed before suggestions start getting rendered. Defaults to 1.</li>
</ol>


<p>Right now we are not supplying options when creating our typeahead object. Let&#8217;s change that by updating our code in <code>main.js</code> to look like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;&lt;APPLICATION ID&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;SEARCH-ONLY API KEY&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;&lt;INDEX NAME&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#typeahead-algolia&#39;</span><span class="p">).</span><span class="nx">typeahead</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">highlight</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">hint</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">minLength</span><span class="o">:</span> <span class="mi">1</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="nx">source</span><span class="o">:</span> <span class="nx">index</span><span class="p">.</span><span class="nx">ttAdapter</span><span class="p">({</span> <span class="s2">&quot;hitsPerPage&quot;</span><span class="o">:</span> <span class="mi">10</span> <span class="p">}),</span>
</span><span class='line'>    <span class="nx">displayKey</span><span class="o">:</span> <span class="s1">&#39;name&#39;</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we have done is passed in an object with the options explicitly set to the defaults. This will give you and idea of what you can tweak and play with. As the code stands now, the application will behave the same. Feel free to try different settings out to see how they behave.</p>

<h3>Enhancing our dataset</h3>

<p>The second parameter to typeahead.js is an object that is a dataset. Datasets in typeahead.js have 4 fields that can be set.</p>

<ol>
<li>source – The backing data source for suggestions. Expected to be a function with the signature (query, cb). It is expected that the function will compute the suggestion set (i.e. an array of JavaScript objects) for query and then invoke cb with said set. cb can be invoked synchronously or asynchronously. A Bloodhound suggestion engine can be used here, to learn how, see Bloodhound Integration. Required.</li>
<li>name – The name of the dataset. This will be appended to tt-dataset- to form the class name of the containing DOM element. Must only consist of underscores, dashes, letters (a-z), and numbers. Defaults to a random number.</li>
<li>displayKey – For a given suggestion object, determines the string representation of it. This will be used when setting the value of the input control after a suggestion is selected. Can be either a key string or a function that transforms a suggestion object into a string. Defaults to value.</li>
<li>templates – A hash of templates to be used when rendering the dataset. Note a precompiled template is a function that takes a JavaScript object as its first argument and returns a HTML string.</li>
</ol>


<p>We have already used source and displayKey. We will now take advantage of templates to further enhance our application.</p>

<h3>Typeahead.js templates</h3>

<p>For our template, we will use <a href="http://twitter.github.io/hogan.js/">Hogan.js</a>. What we essentially need is a function that can take a JavaScript object and return an HTML string. Hogan will give us that functionality.</p>

<p>First thing we need to do is include Hogan.js in our application. Open up <code>index.html</code> and add the following script tag before the Algolia script tag.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;https://cdn.jsdelivr.net/hogan.js/3.0.2/hogan.common.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next we will need to create our template for use by typeahead.js. Open up <code>main.js</code> and add the following code before the typeahead.js code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">template</span> <span class="o">=</span> <span class="nx">Hogan</span><span class="p">.</span><span class="nx">compile</span><span class="p">(</span><span class="s1">&#39;&lt;div class=&quot;hit&quot;&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>  <span class="s1">&#39;&lt;div class=&quot;name&quot;&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>    <span class="s1">&#39;} &#39;</span> <span class="o">+</span>
</span><span class='line'>  <span class="s1">&#39;&lt;/div&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>  <span class="s1">&#39;&#39;</span> <span class="o">+</span>
</span><span class='line'>    <span class="s1">&#39;&lt;div class=&quot;attribute&quot;&gt;: }&lt;/div&gt;&#39;</span> <span class="o">+</span>
</span><span class='line'>  <span class="s1">&#39;&#39;</span> <span class="o">+</span>
</span><span class='line'>  <span class="s1">&#39;&lt;/div&gt;&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This template will serve to show our results by displaying the name along with a sub list of attributes that match out search criteria.</p>

<p>The final piece we need is to tell typeahead.js to use our template. Update the typeahead.js code like the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#typeahead-algolia&#39;</span><span class="p">).</span><span class="nx">typeahead</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">highlight</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">hint</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">minLength</span><span class="o">:</span> <span class="mi">1</span>
</span><span class='line'><span class="p">},</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">source</span><span class="o">:</span> <span class="nx">index</span><span class="p">.</span><span class="nx">ttAdapter</span><span class="p">({</span> <span class="s2">&quot;hitsPerPage&quot;</span><span class="o">:</span> <span class="mi">10</span> <span class="p">}),</span>
</span><span class='line'>  <span class="nx">displayKey</span><span class="o">:</span> <span class="s1">&#39;name&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">templates</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">suggestion</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">hit</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">hit</span><span class="p">.</span><span class="nx">attributes</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// check each hit for highlighted results</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">attribute</span> <span class="k">in</span> <span class="nx">hit</span><span class="p">.</span><span class="nx">_highlightResult</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">attribute</span> <span class="o">===</span> <span class="s1">&#39;name&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="c1">// already shown, no need to add a second time</span>
</span><span class='line'>          <span class="k">continue</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// all highlighted results with match level not equal to non should</span>
</span><span class='line'>        <span class="c1">// be added in order to show up in the results drop down</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">hit</span><span class="p">.</span><span class="nx">_highlightResult</span><span class="p">[</span><span class="nx">attribute</span><span class="p">].</span><span class="nx">matchLevel</span> <span class="o">!==</span> <span class="s1">&#39;none&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">hit</span><span class="p">.</span><span class="nx">attributes</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span>
</span><span class='line'>            <span class="nx">attribute</span><span class="o">:</span> <span class="nx">attribute</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">value</span><span class="o">:</span> <span class="nx">hit</span><span class="p">.</span><span class="nx">_highlightResult</span><span class="p">[</span><span class="nx">attribute</span><span class="p">].</span><span class="nx">value</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// render a template for each hit</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">template</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="nx">hit</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we have done is defined what we want to show for the suggestion in the drop down by building our template. The really cool thing going on here is that we are taking advantage of the <code>_highlightResult</code> object for each of the hits provided by Algolia. For each of the highlighted results that have a match level not equal to none, we add it to our attributes object which will end up being shown as part of our template. Here is an example of a hit with the highlighted results. You will notice that email, web, and name have highlighted results when searching for the letter &#8216;k&#8217;.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="s2">&quot;company&quot;</span><span class="o">:</span> <span class="s2">&quot;Frances Meyer Inc&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;address&quot;</span><span class="o">:</span> <span class="s2">&quot;2505 Congress St&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;email&quot;</span><span class="o">:</span> <span class="s2">&quot;kelli@varrato.com&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;web&quot;</span><span class="o">:</span> <span class="s2">&quot;http://www.kellivarrato.com&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;Kelli Varrato&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;objectID&quot;</span><span class="o">:</span> <span class="s2">&quot;3769410&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;_highlightResult&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;company&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;value&quot;</span><span class="o">:</span> <span class="s2">&quot;Frances Meyer Inc&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchLevel&quot;</span><span class="o">:</span> <span class="s2">&quot;none&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchedWords&quot;</span><span class="o">:</span> <span class="p">[]</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="s2">&quot;address&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;value&quot;</span><span class="o">:</span> <span class="s2">&quot;2505 Congress St&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchLevel&quot;</span><span class="o">:</span> <span class="s2">&quot;none&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchedWords&quot;</span><span class="o">:</span> <span class="p">[]</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="s2">&quot;email&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;value&quot;</span><span class="o">:</span> <span class="s2">&quot;&lt;em&gt;k&lt;/em&gt;elli@varrato.com&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchLevel&quot;</span><span class="o">:</span> <span class="s2">&quot;full&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchedWords&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;k&quot;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="s2">&quot;web&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;value&quot;</span><span class="o">:</span> <span class="s2">&quot;http://www.&lt;em&gt;k&lt;/em&gt;ellivarrato.com&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchLevel&quot;</span><span class="o">:</span> <span class="s2">&quot;full&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchedWords&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;k&quot;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;value&quot;</span><span class="o">:</span> <span class="s2">&quot;&lt;em&gt;K&lt;/em&gt;elli Varrato&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchLevel&quot;</span><span class="o">:</span> <span class="s2">&quot;full&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;matchedWords&quot;</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;k&quot;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Final result</h3>

<p>If everything is working properly, this is what your results should look like.</p>

<p><img src="http://scottksmith.com/images/Algolia_hogan.png" alt="Algolia Advanced Example" /></p>

<h3>Wrap up</h3>

<p>I absolutely love what Algolia is making for real time search. The ease of development is amazing and the speed of the search is unparalleled. Look forward to more articles as I dig deeper into the guts, options, and more on this fantastic developer service.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting Started With Algolia Real Time Search]]></title>
    <link href="http://scottksmith.com/blog/2014/10/21/getting-started-with-algolia-real-time-search/"/>
    <updated>2014-10-21T16:09:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/10/21/getting-started-with-algolia-real-time-search</id>
    <content type="html"><![CDATA[<p>Ever heard of Stripe? Stripe makes it dead simple for developers to add payment processing and management to their applications through a set of tools and APIs. Now, imagine the speed and simplicity of Stripe&#8217;s payment integration for real time search. That is where <a href="https://www.algolia.com/">Algolia</a> comes in. <a href="https://www.algolia.com/">Algolia</a> does for search what Stripe does for payments.</p>

<p><a href="https://www.algolia.com/">Algolia</a> is a service that provides APIs and tools for developers to facilitate and simplify the process of adding real time search to mobile and web applications.</p>

<p>A few of the <a href="https://www.algolia.com/features">features</a> provided by Algolia are:</p>

<ol>
<li>Real time database search</li>
<li>Get up and running in minutes</li>
<li>Client side integrations</li>
<li>Server side integrations</li>
<li>Expert help to build the perfect configuration</li>
</ol>


<p>Enough spouting about how great it is, let&#8217;s start using it!</p>

<h3>Creating an account</h3>

<p>The first thing we need to do is <a href="https://www.algolia.com/users/sign_up">create an account</a>. You will be able to sign up and try out their service using the free Hacker Plan.</p>

<p><img src="http://scottksmith.com/images/Algolia_signup.png" alt="Algolia Signup" /></p>

<p>After you create your account, you will be asked to choose the location of your data center. This is an important step as it will determine performance and latency. As of writing this article it is not possible to change the location of your data center so you will want to choose wisely. The team has informed me this will be possible in the future along with multiple locations. The best advice now is to pick a data center closest to your servers.</p>

<p><img src="http://scottksmith.com/images/Algolia_datacenter.png" alt="Algolia Datacenter" /></p>

<p>After you pick the best data center, in my case North America West, you will be presented with a page to create your first data index.</p>

<h3>Creating your first index</h3>

<p>Indexes are entities within Algolia that allow you to define the attributes you want be be searched, the rank/order of those attributes, how to display that data, and much more.</p>

<p><img src="http://scottksmith.com/images/Algolia_start.png" alt="Algolia Start" /></p>

<p>You have three options for creating your first index.</p>

<ol>
<li>Quick start with sample data</li>
<li>Upload your own data via the web application</li>
<li>Use of the API clients to get started</li>
</ol>


<p>For this tutorial we will use the sample data option. Go ahead and pick the middle option: User Profile. You will see a loading screen as your data is being imported. Once it is done, you should see something similar to this. You are now ready to make your first search.</p>

<p><img src="http://scottksmith.com/images/Algolia_index.png" alt="Algolia Index" /></p>

<p>Algolia provides a very nice interface here that allows you to explore and search your newly created index. In the section titled &#8220;Explore your index&#8221;, you can enter search terms and see your results instantly below. Here is what it looks like when searching for the name &#8220;Kevin&#8221;.</p>

<p><img src="http://scottksmith.com/images/Algolia_explore.png" alt="Algolia Index Explore" /></p>

<p>You also have the option to view the data as raw JSON along with specifying numerous query parameters to control the search.</p>

<h3>Adding real time to search to a web app</h3>

<p>Let&#8217;s explore now how to integrate Algolia into a web application in order to provide real time search.</p>

<p>We will first create our HTML file for the web application. In order to keep this article simple to follow, I will not be placing CSS or JavaScript in separate files. Go ahead and create an <code>index.html</code> file with the following content.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html</span> <span class="na">lang=</span><span class="s">&#39;en&#39;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;title&gt;</span>Algolia | User Search<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>  <span class="nt">&lt;style&gt;</span>
</span><span class='line'>    <span class="nc">.search</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">text-align</span><span class="o">:</span> <span class="k">center</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nc">.search</span> <span class="nt">input</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">font-size</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span>
</span><span class='line'>      <span class="k">width</span><span class="o">:</span> <span class="m">300px</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nc">.results</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">margin</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span>
</span><span class='line'>      <span class="k">text-align</span><span class="o">:</span> <span class="k">center</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nc">.results</span> <span class="nt">ul</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">list-style-type</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'>      <span class="k">padding</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="nt">&lt;/style&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;search&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;h1&gt;</span>Search users in real time<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;results&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;ul</span> <span class="na">id=</span><span class="s">&quot;users&quot;</span><span class="nt">&gt;&lt;/ul&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;//cdn.jsdelivr.net/jquery/2.1.3/jquery.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;//cdn.jsdelivr.net/algoliasearch/3/algoliasearch.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script&gt;</span>
</span><span class='line'>    <span class="c1">//TODO</span>
</span><span class='line'>  <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we have here is a very simple page with an input box that will allow us to search our data indexed with Algolia. We are including jQuery to simplify the code and the latest Algolia client side script to facilitate our integration.</p>

<p>The next thing we will do is add code to make queries to Algolia as a user enters search terms. Update your <code>index.html</code> file with the following code within the <code>&lt;script&gt;</code> tags by replacing the <code>//TODO</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script&gt;</span>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;&lt;APPLICATION ID&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;SEARCH-ONLY API KEY&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;&lt;INDEX NAME&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">$input</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;input&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">$input</span><span class="p">.</span><span class="nx">keyup</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">index</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="nx">$input</span><span class="p">.</span><span class="nx">val</span><span class="p">(),</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">hitsPerPage</span><span class="o">:</span> <span class="mi">10</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">facets</span><span class="o">:</span> <span class="s1">&#39;*&#39;</span>
</span><span class='line'>    <span class="p">},</span> <span class="nx">searchCallback</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}).</span><span class="nx">focus</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">searchCallback</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are 3 items in the code we just added that need to be configured for your account. You can find your APPLICATION ID and SEARCH-ONLY API KEY on the <a href="https://www.algolia.com/licensing">Credentials</a> page of your account. Once you find them, update <code>&lt;APPLICATION ID&gt;</code> and <code>&lt;SEARCH-ONLY API KEY&gt;</code> with the values from your account. The final value needing to be updated is INDEX NAME. You can find the name of your index on the <a href="https://www.algolia.com/explorer">Indices</a> page. Mine is called <code>test_drive_contacts</code>. Once you find yours, update <code>&lt;INDEX NAME&gt;</code> with it.</p>

<p>There are a few things going on here in the code we just added. First, we are setting up a function to handle our callback from performing an Agolia search. We will return to this function in a bit and add functionality to it. For now, we will just log the JSON response to the console. Next, once the document is ready, we create an Algolia Search object with our API credentials. We then initialize our index with our Algolia Search object using the index name from our account.</p>

<p>Finally, we hook into the <code>keyup</code> event on our input field in order to fire off a search on our Algolia Index object. When this call completes, it will call the <code>searchCallback</code> function we defined.</p>

<p>With this bit of code we have successfully hooked into Algolia&#8217;s real time search. If you test this out in your web browser and open up the developer tools, you will see response data coming back in your console as you type characters in the search box.</p>

<h3>Show our search results</h3>

<p>Now that we have the core code in place to talk to and query our data from Agolia, we need to show that data to the user. To do this we will update the <code>searchCallback</code> function to show the resulting names. Update the <code>searchCallback</code> function to the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">searchCallback</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">$users</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#users&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">$users</span><span class="p">.</span><span class="nx">empty</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">content</span><span class="p">.</span><span class="nx">hits</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$users</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="s1">&#39;&lt;li&gt;&#39;</span> <span class="o">+</span> <span class="nx">content</span><span class="p">.</span><span class="nx">hits</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">name</span> <span class="o">+</span> <span class="s1">&#39;&lt;/li&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is simple web code not specific to Algolia. We are using jQuery to add the names returned in the search to an unordered list. First we clear out the list and then add the name of the user from the result. Once you have this done, try it out. You should see very fast results being returned and shown.</p>

<p><img src="http://scottksmith.com/images/Algolia_search.png" alt="Algolia Search" /></p>

<h3>Where to go from here</h3>

<p>We have only scratched the surface of what is available from Algolia&#8217;s real time search. Some of the many things we have not touched on are Sorting, Filtering, Faceting, and Geo-Search. To learn more, check out these <a href="https://www.algolia.com/doc/tutorials">tutorials</a> and <a href="https://www.algolia.com/doc/javascript">explore their documentation</a>.</p>

<p>Also, in case you run into any issue with this tutorial, here is the final code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html</span> <span class="na">lang=</span><span class="s">&quot;en&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;title&gt;</span>Algolia | User Search<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>  <span class="nt">&lt;style&gt;</span>
</span><span class='line'>    <span class="nc">.search</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">text-align</span><span class="o">:</span> <span class="k">center</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nc">.search</span> <span class="nt">input</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">font-size</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span>
</span><span class='line'>      <span class="k">width</span><span class="o">:</span> <span class="m">300px</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nc">.results</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">margin</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span>
</span><span class='line'>      <span class="k">text-align</span><span class="o">:</span> <span class="k">center</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="nc">.results</span> <span class="nt">ul</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">list-style-type</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</span><span class='line'>      <span class="k">padding</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="nt">&lt;/style&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;search&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;h1&gt;</span>Search users in real time<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;results&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;ul</span> <span class="na">id=</span><span class="s">&quot;users&quot;</span><span class="nt">&gt;&lt;/ul&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;//cdn.jsdelivr.net/jquery/2.1.3/jquery.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;//cdn.jsdelivr.net/algoliasearch/3/algoliasearch.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script&gt;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$input</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;input&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$users</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#users&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">algoliasearch</span><span class="p">(</span><span class="s1">&#39;&lt;APPLICATION ID&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;&lt;SEARCH-ONLY API KEY&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">initIndex</span><span class="p">(</span><span class="s1">&#39;&lt;INDEX NAME&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">$input</span><span class="p">.</span><span class="nx">keyup</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">index</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="nx">$input</span><span class="p">.</span><span class="nx">val</span><span class="p">(),</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">hitsPerPage</span><span class="o">:</span> <span class="mi">10</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">facets</span><span class="o">:</span> <span class="s1">&#39;*&#39;</span>
</span><span class='line'>        <span class="p">},</span> <span class="nx">searchCallback</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}).</span><span class="nx">focus</span><span class="p">();</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">searchCallback</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">$users</span><span class="p">.</span><span class="nx">empty</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">content</span><span class="p">.</span><span class="nx">hits</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">$users</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="s1">&#39;&lt;li&gt;&#39;</span> <span class="o">+</span> <span class="nx">content</span><span class="p">.</span><span class="nx">hits</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">name</span> <span class="o">+</span> <span class="s1">&#39;&lt;/li&gt;&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>  <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Twitatron: Building a production web app with Node]]></title>
    <link href="http://scottksmith.com/blog/2014/10/05/twitatron-building-a-production-web-app-with-node/"/>
    <updated>2014-10-05T09:30:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/10/05/twitatron-building-a-production-web-app-with-node</id>
    <content type="html"><![CDATA[<p>Welcome to part 1 of the Twitaron series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2014/10/05/twitatron-building-a-production-web-app-with-node/">Getting started</a></li>
<li><a href="http://scottksmith.com/blog/2015/03/23/twitatron-building-a-production-web-app-with-node-views-and-controllers/">Views &amp; Controllers</a></li>
<li><a href="http://scottksmith.com/blog/2015/05/26/twitatron-building-a-production-web-app-with-node-user-accounts/">User Accounts</a></li>
<li>Under development&#8230;</li>
</ol>


<p>While writing the <a href="http://scottksmith.com/blog/2014/05/02/building-restful-apis-with-node/">Beer Locker tutorials</a> many readers commented on how helpful it was to have a full walk through on creating RESTful APIs. I am going to continue this trend and start a multi part tutorial series on how to create a production ready Node web application.</p>

<p>Some of you may know about my latest project <a href="https://favatron.com">Favatron</a>. It is a Node web application that integrates with Twitter to provide an automated bookmark and read later service for Twitter favorites. Using <a href="https://favatron.com">Favatron</a> as a guide, I will take you through the entire process of creating a fully functional production ready Node web application. Some of the many parts we will touch on include authorization, user accounts, data storage, background workers, security, email, APIs, RSS, third party service integrations, and much more.</p>

<p>I am proud to introduce Twitatron, the web application we will be making. Twitatron will automatically monitor your Twitter account for mentions. When it finds those mentions, it will process them, store them, show them in the UI, expose them via an API endpoint and RSS feed, send an email digest, and share weekly stats with integrated social networks.</p>

<p>Enough talking, let&#8217;s get started!</p>

<h3>Prerequisites</h3>

<p>Before starting the tutorial, you will need to make sure and have Node.js and MongoDB installed.</p>

<ol>
<li>Install the latest version of <a href="http://nodejs.org/download/">Node</a>. This will also automatically install <a href="https://www.npmjs.org/">npm</a> which will be used to manage packages.</li>
<li>Install and run <a href="http://docs.mongodb.org/manual/installation/">MongoDB</a>. If you would prefer to not install MongoDB locally, you can always sign up for a <a href="https://mongolab.com/">free MongoLab account</a> and use it instead.</li>
</ol>


<h3>Initialize our Node application</h3>

<p>First thing we need to do is create a directory for our application. I went ahead and named mine <code>twitatron</code>. Feel free to name yours whatever you want.</p>

<p>In your console, navigate into your newly create folder and run the following command:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm init
</span></code></pre></td></tr></table></div></figure>


<p>You will be asked a few questions in order to have npm automatically create a <code>package.json</code> file for you. The only one that matters at this time is the entry point. You will want to specify <code>server.js</code>. For reference, here is what mine looked like.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm init
</span><span class='line'>This utility will walk you through creating a package.json file.
</span><span class='line'>It only covers the most common items, and tries to guess sane defaults.
</span><span class='line'>
</span><span class='line'>See <span class="sb">`</span>npm help json<span class="sb">`</span> for definitive documentation on these fields
</span><span class='line'>and exactly what they do.
</span><span class='line'>
</span><span class='line'>Use <span class="sb">`</span>npm install &lt;pkg&gt; --save<span class="sb">`</span> afterwards to install a package and
</span><span class='line'>save it as a dependency in the package.json file.
</span><span class='line'>
</span><span class='line'>Press ^C at any <span class="nb">time </span>to quit.
</span><span class='line'>name: <span class="o">(</span>twitatron<span class="o">)</span>
</span><span class='line'>version: <span class="o">(</span>1.0.0<span class="o">)</span>
</span><span class='line'>description: Twitter mention tracker
</span><span class='line'>entry point: <span class="o">(</span>index.js<span class="o">)</span> server.js
</span><span class='line'>test command:
</span><span class='line'>git repository:
</span><span class='line'>keywords:
</span><span class='line'>author: Scott Smith
</span><span class='line'>license: <span class="o">(</span>ISC<span class="o">)</span>
</span><span class='line'>About to write to /Users/scott/Projects/twitatron/package.json:
</span><span class='line'>
</span><span class='line'><span class="o">{</span>
</span><span class='line'>  <span class="s2">&quot;name&quot;</span>: <span class="s2">&quot;twitatron&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;version&quot;</span>: <span class="s2">&quot;1.0.0&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;description&quot;</span>: <span class="s2">&quot;Twitter mention tracker&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;main&quot;</span>: <span class="s2">&quot;server.js&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;scripts&quot;</span>: <span class="o">{</span>
</span><span class='line'>    <span class="s2">&quot;test&quot;</span>: <span class="s2">&quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 1&quot;</span>
</span><span class='line'>  <span class="o">}</span>,
</span><span class='line'>  <span class="s2">&quot;author&quot;</span>: <span class="s2">&quot;Scott Smith&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;license&quot;</span>: <span class="s2">&quot;ISC&quot;</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>Is this ok? <span class="o">(</span>yes<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Directory structure</h3>

<p>As we progress through this tutorial series, we will be adding many directories to our application. Here is what the final structure will be.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>twitatron/
</span><span class='line'>  config/         // hold our configuration values
</span><span class='line'>  controllers/    // hold our controllers
</span><span class='line'>  models/         // holds our models
</span><span class='line'>  node_modules/   // npm packages (auto created by npm)
</span><span class='line'>  public/         // hold our static html, images, css, javascript, etc
</span><span class='line'>  views/          // hold our jade views
</span><span class='line'>  package.json    // defines our node app and dependencies
</span><span class='line'>  server.js       // main application logic</span></code></pre></td></tr></table></div></figure>


<p>Don&#8217;t worry too much now about creating all those directories. We will be creating them as we progress through the tutorial.</p>

<h3>Simple HTTP server</h3>

<p>Now it is time to start building our application. Within the application directory, create a file named <code>server.js</code>. This is the main entry point for our application. It is what will be run by Node. Let&#8217;s start our application as a super simple HTTP listener that just returns back &#8216;Twitatron&#8217; for all HTTP requests.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">http</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">http</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">end</span><span class="p">(</span><span class="s1">&#39;Twitatron!&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}).</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we are doing here is using the built in Node <code>http</code> module to start an HTTP server on port 3000. We then respond back to all requests with with the string &#8216;Twitatron!&#8217;. Start your application with the command <code>node server.js</code> and browse to it at <a href="http://localhost:3000">http://localhost:3000</a>.</p>

<h3>Replace HTTP with Express</h3>

<p>Our basic application is cool, but using the <code>http</code> module will get very difficult as the complexity increases. That is where <a href="http://expressjs.com/">Express</a> comes in! Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications.</p>

<p>We will use <code>npm</code> to install the Express module. Execute the following command and make sure to include the <code>--save</code> flag. This flag will add Express to the list of Node dependencies for your application. This is useful because in most cases you won&#8217;t add the <code>node_modules</code> directory to source control which means for other people that use your application, they will need to know which packages to install. This is done by executing the <code>npm install</code> command which will download and install any packages not in the local <code>node_modules</code> directory.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install express --save
</span></code></pre></td></tr></table></div></figure>


<p>You should now have Express added to the <code>node_modules</code> directory and the <code>package.json</code> file should have it added to the dependencies object as well. Here is what my <code>package.json</code> file now has.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;twitatron&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;version&quot;</span><span class="o">:</span> <span class="s2">&quot;1.0.0&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;description&quot;</span><span class="o">:</span> <span class="s2">&quot;Twitter mention tracker&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;main&quot;</span><span class="o">:</span> <span class="s2">&quot;server.js&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;scripts&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;test&quot;</span><span class="o">:</span> <span class="s2">&quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 1&quot;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="s2">&quot;author&quot;</span><span class="o">:</span> <span class="s2">&quot;Scott Smith&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;license&quot;</span><span class="o">:</span> <span class="s2">&quot;ISC&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;dependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;express&quot;</span><span class="o">:</span> <span class="s2">&quot;^4.9.5&quot;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that we have Express installed, we can update our server code to use it. Replace your <code>server.js</code> file with the following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express router</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">Router</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Initial dummy route for testing</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">end</span><span class="p">(</span><span class="s1">&#39;Twitatron&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Register all our routes</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">router</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s explore what we added to our application in detail.</p>

<p><strong>Require</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Get the packages we need</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>This block of code will load the Express package and allow us to use it within our application. We will be requiring more packages here as we add more complexity to our application.</p>

<p><strong>Express Application</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>The Express Application is the main component for your web application. Among other things, it is used to define routes, start listening for http connections, and perform routing for requests.</p>

<p><strong>Express Router</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Create our Express router</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">Router</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>A router is an isolated instance of middleware and routes. Routers can be thought of as &#8220;mini&#8221; applications only capable of performing middleware and routing. Every express application has a builtin app router. Routers behave like middleware themselves and can be &#8220;.use()&#8217;d&#8221; by the app or in other routers.</p>

<p><strong>Create Route</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Initial dummy route for testing</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">end</span><span class="p">(</span><span class="s1">&#39;Twitatron&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we are creating a route for &#8216;/&#8217; to return &#8216;Twitatron&#8217;. All HTTP requests made to &#8216;/&#8217; will execute this portion of code and return back a string.</p>

<p><strong>Register Routes and Start Server</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Register all our routes</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">router</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally we register our previously defined routes with the application.</p>

<p>The last step is to call <code>listen</code> on port 3000 to start listening for incoming connections and requests.</p>

<p><strong>Test it out</strong></p>

<p>If you did everything correctly, you should be able to start your server and make your first request. In the root folder of your application run:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>node server.js
</span></code></pre></td></tr></table></div></figure>


<p>Open your browser and browse to <a href="http://localhost:3000/">http://localhost:3000/</a>. You should get back a response with the word &#8216;Twitatron&#8217;.</p>

<h3>Nodemon</h3>

<p>Now is a good time to segue into some tooling that will make things much easier when developing Node applications. <a href="http://nodemon.io/">Nodemon</a> is a utility that will monitor for any changes in your source and automatically restart your server.</p>

<p>You can install it using npm using the following command. I like to install it globally so I can use it for all projects, but you can remove the <code>-g</code> to install it locally instead.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install -g nodemon
</span></code></pre></td></tr></table></div></figure>


<p>Now instead of using <code>node server.js</code> to run your application, you can use <code>nodemon server.js</code>. It will watch for any changes in your application and automatically restart your server for you.</p>

<h3>Node Inspector</h3>

<p><a href="https://github.com/node-inspector/node-inspector">Node Inspector</a> is a debugger interface for Node.js applications that uses the Blink Developer Tools. The really cool thing is that it works almost exactly as the Chrome Developer Tools.</p>

<p>Some of the things you can do with Node Inspector are:</p>

<ul>
<li>Navigate in your source files</li>
<li>Set breakpoints (and specify trigger conditions)</li>
<li>Step over, step in, step out, resume (continue)</li>
<li>Inspect scopes, variables, object properties</li>
<li>Hover your mouse over an expression in your source to display its value in a tooltip</li>
<li>Edit variables and object properties</li>
<li>Continue to location</li>
<li>Break on exceptions</li>
<li>Disable/enable all breakpoints</li>
</ul>


<p>Just like Nodemon, you can install it locally or globally. Use the following command to install it globablly:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install -g node-inspector
</span></code></pre></td></tr></table></div></figure>


<p>Once it is installed, you can run it using the following command. This will start the debugger and open your browser.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>node-debug server.js
</span></code></pre></td></tr></table></div></figure>


<h3>Serving static content</h3>

<p>The final piece of this part will be adding the ability to serve static content such as HTML, images, CSS, JavaScript, etc. To do this we will need to use the <a href="http://expressjs.com/4x/api.html#express.static">Express static middleware</a>.</p>

<p>Update <code>server.js</code> with the following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add static middleware</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="kr">static</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/public&#39;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express router</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">express</span><span class="p">.</span><span class="nx">Router</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we have done here is register the static middleware with our Express application and told it our static content should be served from the <code>public</code> directory. If you didn&#8217;t already create the <code>public</code> directory, please do so now. You will also need to create <code>js</code>, <code>img</code>, and <code>css</code> as subdirectories.</p>

<p>Save <a href="http://scottksmith.com/images/birdatron-small.jpg">this image</a> (right click and save as) to your newly created <code>public/img</code> directory and name it <code>birdatron-small.jpg</code>. Image is Creative Commons licensed by <a href="https://www.flickr.com/photos/keoni101/">Keoni Cabral</a> and can be found <a href="https://www.flickr.com/photos/keoni101/5378177339/in/photolist-9cfyKv-5yyZvf-eXRPno-7fcWcC-3FKdg-687fi2-nn75ou-7BkmKT-9uC7Bj-9dGgEf-7oRoDs-9EUbXH-8MrU4Z-dRuEno-oNu6bQ-7CUsNN-8xx539-877bg5-73mvEr-24CgB-85T5T8-7uv3Nh-5yTumQ-9uz7Wa-8xaJqB-8D7z4g-eNC3WB-4ukiRF-9VfCzc-5jywWv-6qZMc5-8NZqBB-8z1APg-cYGmY1-dYRS9n-dYRSe6-6N6cEx-eNC3Nt-eb9p6k-dBomcA-9q28rg-4F9jd3-4BssTb-6mMBE3-8UMRPQ-LWeDw-7wVrhV-eb9iKn-6Pdep-9DEwyi">here</a>.</p>

<p>In the <code>public</code> directory, create a file named <code>index.html</code> and add the following markup to it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!doctype html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;title&gt;</span>Twitatron<span class="nt">&lt;/title&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'>  <span class="nt">&lt;h1&gt;</span>Twitatron has been born!<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>  <span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">&quot;/img/birdatron-small.jpg&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Open up your web browser and browse to <a href="http://localhost:3000/">http://localhost:3000/</a>. If everything was done correctly, you should see the following. You will notice now that our route that returned back &#8216;Twitatron&#8217; is no longer getting executed. This is because the static middleware is automatically looking for <code>index.html</code> in the root of the <code>public</code> directory and returning it. If that were not there or named anything but <code>index.html</code>, the original route would execute.</p>

<p><img src="http://scottksmith.com/images/twitatron1.png" alt="Static page screenshot" /></p>

<h3>Compress our static content</h3>

<p>If you were to open up your DevTools and request <a href="http://localhost:3000/">http://localhost:3000/</a> you would notice the response is not being compressed with gzip. This is very inefficient yet surprisingly easy to fix. First thing we need to do is install the <a href="https://www.npmjs.org/package/compression">compression</a> npm package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install compression --save
</span></code></pre></td></tr></table></div></figure>


<p>Once installed, we can update our <code>server.js</code> to use this package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">compression</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;compression&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add content compression middleware</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">compression</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you were to make a request again, you wouldn&#8217;t see the response headers indicating the content has been compressed with gzip. The reason for this is that the <code>compression</code> package defaults the bytes threshold to 1024. Our <code>index.html</code> file is below that threshold so it isn&#8217;t compressed. If you want to force compression on all responses regardless of size, you can update the code like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">compression</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">threshold</span><span class="o">:</span> <span class="kc">false</span>
</span><span class='line'><span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can also control it by the number of bytes for the threshold like this.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">compression</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">threshold</span><span class="o">:</span> <span class="mi">256</span>
</span><span class='line'><span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>I would suggest leaving the defaults as is because there tends to be no gain when making the threshold too small. There are cases where your response could actually be bigger after compression.</p>

<h3>Cache our static content</h3>

<p>The last part of this tutorial will be caching our static content client side. This helps reduce unnecessary requests to your server and makes page load times much faster for client browsers. To do this, we will use the Express cache middleware.</p>

<p>If you were to examine the response headers now, you would see the following.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">Cache-Control: public, max-age=0</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is telling the client browser to not cache the content. In order to change this, we need to update our Express static middleware in <code>server.js</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Add static middleware</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">oneDay</span> <span class="o">=</span> <span class="mi">86400000</span><span class="p">;</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">express</span><span class="p">.</span><span class="kr">static</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/public&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">maxAge</span><span class="o">:</span> <span class="nx">oneDay</span> <span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we have done here is tell our Express application to set the <code>Cache-Control</code> header to one day using milliseconds. Here is what the response headers look like after this change.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">Cache-Control: public, max-age=86400</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Wrap up</h3>

<p>We now have the tools to create a simple, yet fully functional web application capable of serving static content that can be compressed and cached client side. This is just the beginning of a thorough and detailed tutorial series on building production ready Node web applications.</p>

<p>If you found this article or others useful be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>

<p>Source code for this part can be found <a href="https://github.com/scottksmith95/twitatron/tree/master/01">here on GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[3 Essential Sublime Text Plugins for Node &amp; JavaScript developers]]></title>
    <link href="http://scottksmith.com/blog/2014/09/29/3-essential-sublime-text-plugins-for-node-and-javascript-developers/"/>
    <updated>2014-09-29T14:20:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/09/29/3-essential-sublime-text-plugins-for-node-and-javascript-developers</id>
    <content type="html"><![CDATA[<p>Check out these 3 great and essential Sublime Text plugins every JavaScript and Node developer should know about and use.</p>

<h3>JsFormat</h3>

<p><a href="https://github.com/jdc0589/JsFormat">https://github.com/jdc0589/JsFormat</a></p>

<p>JsFormat is a JavaScript formatting plugin. Behind the scenes, it uses the command line formatter from <a href="http://jsbeautifier.org/">jsbeautifier.org</a> to format full or portions of JavaScript and JSON files.</p>

<p><strong>Features</strong></p>

<ol>
<li>JavaScript formatting</li>
<li>JSON formatting</li>
<li>Full file formatting</li>
<li>Selected text formatting</li>
<li>Customizable settings for formatting options</li>
<li>Customize per project with .jsbeautifyrc settings file</li>
</ol>


<p><strong>Usage</strong></p>

<p>Either <code>cmd+alt+f</code> on OS X or <code>ctrl+alt+f</code> on Linux/Windows</p>

<h3>JSHint</h3>

<p><a href="https://github.com/uipoet/sublime-jshint">https://github.com/uipoet/sublime-jshint</a></p>

<p>&#8220;JSHint is a community-driven tool to detect errors and potential problems in JavaScript code and to enforce your team&#8217;s coding conventions. It is very flexible so you can easily adjust it to your particular coding guidelines and the environment you expect your code to execute in. JSHint is open source and will always stay this way.&#8221; - <a href="http://www.jshint.com/about/">JSHint</a></p>

<p><img src="http://scottksmith.com/images/jshint.png" alt="Example of JSHint" /></p>

<p><strong>Usage</strong></p>

<p><code>ctrl+j</code> on OS X or <code>alt+j</code> on Linux/Windows</p>

<p>If you would like to have JSHint run anytime you save a JavaScript file (highly suggest this), you will need to install the <a href="https://github.com/alexnj/SublimeOnSaveBuild">SublimeOnSaveBuild package</a>.</p>

<h3>JavaScriptNext</h3>

<p><a href="https://github.com/Benvie/JavaScriptNext.tmLanguage">https://github.com/Benvie/JavaScriptNext.tmLanguage</a></p>

<p>This plugin is a better syntax highlighter for JavaScript. Not only does it improve syntax highlighting for current ES5, it also adds syntax highlighting for new ES6 syntax such as modules, succinct methods, arrow functions, classes, and generators.</p>

<p>Here is the original JavaScript syntax highlighter:</p>

<p><img src="http://scottksmith.com/images/jssyntax.png" alt="Original JavaScript Syntax Highlighter" /></p>

<p>Here is the new JavaScript syntax highlighter:</p>

<p><img src="http://scottksmith.com/images/jsnextsyntax.png" alt="New JavaScript Syntax Highlighter" /></p>

<p><strong>Usage</strong></p>

<p>You can either set individual JavaScript files to use this syntax highlighter by changing it in the &#8220;View -> Syntax&#8221; menu or you can change it for all JavaScript files in the &#8220;View -> Syntax -> Open all with current extension as&#8221;.</p>

<h3>Wrap up</h3>

<p>These 3 plugins have been very beneficial to me as a JavaScript and Node developer. If you know of other useful plugins, feel free to share them in the comments.</p>

<p>If you found this article or others useful be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Protect Your Node App's Noggin With Helmet]]></title>
    <link href="http://scottksmith.com/blog/2014/09/21/protect-your-node-apps-noggin-with-helmet/"/>
    <updated>2014-09-21T20:48:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/09/21/protect-your-node-apps-noggin-with-helmet</id>
    <content type="html"><![CDATA[<p>There are many ways in which attackers will attempt to exploit your applications and users. Some of the more famous are cross-site scripting (XSS), script injection, clickjacking, insecure requests, and identifying web application frameworks to name a few.</p>

<p>In my previous article, <a href="http://scottksmith.com/blog/2014/09/04/simple-steps-to-secure-your-express-node-application/">4 Simple Steps to Secure Your Express Node Application</a>, we learned how to use HTTPS to avoid man in the middle attacks, secure our cookies from being read by client side JavaScript, prevent our cookies from being sent on an HTTP request, and how to prevent cross-site request forgery attacks.</p>

<p>This article will focus more on middleware we can add to Express to further lock down our application.</p>

<!-- more -->


<h3>Helmet</h3>

<p>We will be using <a href="https://github.com/evilpacket/helmet">Helmet</a>, a set of Express middleware, to help lock down and secure our web applications.</p>

<p>To install Helmet, simply run the following command in your application.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install helmet --save
</span></code></pre></td></tr></table></div></figure>


<p>Here is a simple sample Express application to get us started using Helmet. You will notice the main addition is requiring the Helmet module.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required modules</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Simple endpoint</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Time to secure your application...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The following sections will dive into each of the security features provided by Helmet.</p>

<h3>Content Security Policy (CSP)</h3>

<p><a href="http://content-security-policy.com/">Content Security Policy (CSP)</a> is a promising defense against the risk and impact of <a href="https://developer.mozilla.org/en-US/docs/Glossary/Cross-site_scripting">XSS</a> attacks. Its main goal is to prevent anything unintended being injected into our page. This can include frames, images, tracking scripts, and opening the door to XSS vulnerabilities.</p>

<p>CSP works by setting whitelists in the <code>Content-Security-Policy</code> response header to define sources of trusted content. The browser is then only allowed to execute or render resources from those trusted sources. This means that if someone were to successfully inject their script into your page, the browser would not execute it as the source would not be in the whitelist.</p>

<p>The main types of resources that can be controlled with CSP are:</p>

<ul>
<li>JavaScript</li>
<li>Stylesheets</li>
<li>Images</li>
<li>AJAX, WebSockets, etc.</li>
<li>Fonts</li>
<li>Plugins</li>
<li>HTML5 Media Elements</li>
<li>Frames</li>
</ul>


<p>So enough about what CSP is and what it provides. You are here to learn how to protect your web application. If you want to learn more, I would suggest a great article on <a href="http://www.html5rocks.com/en/tutorials/security/content-security-policy">HTML5 Rocks</a>. Let&#8217;s dive into how we can implement CSP with Helmet.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required modules</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Implement CSP with Helmet</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">csp</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">defaultSrc</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;&#39;self&#39;&quot;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">scriptSrc</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.google-analytics.com&#39;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">styleSrc</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;&#39;unsafe-inline&#39;&quot;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">imgSrc</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;*.google-analytics.com&#39;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">connectSrc</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;&#39;none&#39;&quot;</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">fontSrc</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>  <span class="nx">objectSrc</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>  <span class="nx">mediaSrc</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>  <span class="nx">frameSrc</span><span class="o">:</span> <span class="p">[]</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Simple endpoint</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Time to secure your application...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>So what I have done here is told our Express application to use helmet.csp() and passed in some optional parameters. Helmet does have a way to use it with defaults, but I would suggest being explicit so you know exactly what it is being done. If you do want to use the defaults, you can do it with <code>app.use(helmet());</code>.</p>

<p><strong>defaultSrc</strong></p>

<p>This is the default policy for loading all content. Whatever is defined here applies to all the other type unless you set them to <code>'none'</code>. In our case we are saying that any content coming from the same origin is allowed.</p>

<p><strong>scriptSrc</strong></p>

<p>This is the policy for controlling the valid sources of JavaScript. In our case we are setting <code>*.google-analytics.com</code> as an allowed source for scripts. This is in addition to the same origin rule we defined in <code>defaultSrc</code>.</p>

<p><strong>styleSrc</strong></p>

<p>This is the policy for controlling the valid sources of stylesheets. What we are doing here is using the <code>'unsafe-inline'</code> keyword to allow inline stylesheets. If this was not set, any inline stylesheets would not work.</p>

<p><strong>imgSrc</strong></p>

<p>This is the policy for controlling the valid sources of images. Just like <code>scriptSrc</code>, we are setting the allowed domain for images.</p>

<p><strong>connectSrc</strong></p>

<p>This is the policy for controlling the valid sources of AJAX, WebSockets, or EventSource. In this case, we are using the <code>'none'</code> keyword to state that no content of this type should be allowed. This overrides the <code>defaultSrc</code> directive.</p>

<p><strong>fontSrc</strong></p>

<p>This is the policy for controlling the valid sources of fonts. It is blank to state the only whitelist to use is the one defined in <code>defaultSrc</code>.</p>

<p><strong>objectSrc</strong></p>

<p>This is the policy for controlling the valid sources of plugins like <code>&lt;object&gt;</code>, <code>&lt;embed&gt;</code>, or <code>&lt;applet&gt;</code>. It is blank to state the only whitelist to use is the one defined in <code>defaultSrc</code>.</p>

<p><strong>mediaSrc</strong></p>

<p>This is the policy for controlling the valid sources of HTML5 media types like <code>&lt;audio&gt;</code> or <code>&lt;video&gt;</code>. It is blank to state the only whitelist to use is the one defined in <code>defaultSrc</code>.</p>

<p><strong>frameSrc</strong></p>

<p>This is the policy for controlling the valid sources of frames. It is blank to state the only whitelist to use is the one defined in <code>defaultSrc</code>.</p>

<p>There are four special keywords you can use when defining whitelists:</p>

<ol>
<li><code>'none'</code> will match nothing</li>
<li><code>'self'</code> will match the current origin but not subdomains</li>
<li><code>'unsafe-inline'</code> allows inline JavaScript and CSS</li>
<li><code>'unsafe-eval'</code> allows things like eval() to work</li>
</ol>


<p>There are also 5 other directives you can use. If interested, you can read more about them <a href="http://content-security-policy.com/">here</a>.</p>

<ol>
<li><code>sandbox</code></li>
<li><code>eportUri</code></li>
<li><code>reportOnly</code></li>
<li><code>setAllHeaders</code></li>
<li><code>safari5</code></li>
</ol>


<p>And finally here is what the response header looks like for our example (newlines added for better reading).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">Content-Security-Policy: </span>
</span><span class='line'><span class="err">  default-src &#39;self&#39;;</span>
</span><span class='line'><span class="err">  script-src *.google-analytics.com;</span>
</span><span class='line'><span class="err">  object-src ;</span>
</span><span class='line'><span class="err">  img-src *.google-analytics.com;</span>
</span><span class='line'><span class="err">  media-src ;</span>
</span><span class='line'><span class="err">  frame-src ;</span>
</span><span class='line'><span class="err">  font-src ;</span>
</span><span class='line'><span class="err">  connect-src &#39;none&#39;;</span>
</span><span class='line'><span class="err">  style-src &#39;unsafe-inline&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>XSS Filter</h3>

<p>The XSS Filter was created to help protect against XSS attack. Ironically, it actually helps attackers perform XSS attacks against older versions of Internet Explorer! You can read more about it <a href="http://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities/">here</a>.</p>

<p>What we need to do is have the <code>X-XSS-Protection</code> header set to <code>0</code> in order to disable it for older versions of IE. Helmet provides a piece of middleware to do just that. It will detect the web browser and either set it to <code>1; mode=block</code> or <code>0</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required modules</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Implement X-XSS-Protection</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">xssFilter</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Simple endpoint</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Time to secure your application...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is what the response header looks like when using a modern web browser without the exploit.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">X-XSS-Protection: 1; mode=block</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here is what it would look like on an older version of Internet Explorer with the exploit.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">X-XSS-Protection: 0</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Frame Options</h3>

<p>To help mitigate the risk of <a href="https://en.wikipedia.org/wiki/Clickjacking">clickjacking attacks</a>, Helmet offers a piece of middleware to help control the <code>X-Frame</code> response header. What this does is allow you to control if and where your page can be put into a <code>&lt;frame&gt;</code> or <code>&lt;iframe&gt;</code>. This is also nice even from a non security point of view. You may not want your site to be loaded within anyone else&#8217;s frames from a purely aesthetic point of view.</p>

<p>There are three options with the <code>X-Frame</code> response header:</p>

<ol>
<li>Deny - Does not allow your page to be served inside any frames.</li>
<li>SameOrigin - Allows your page to be served inside a frame with the same origin.</li>
<li>Allow-From - Allows your page to be served inside a frame from a specific URL.</li>
</ol>


<p><strong>Deny</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required modules</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Implement X-Frame: Deny</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">xframe</span><span class="p">());</span>
</span><span class='line'><span class="c1">//app.use(helmet.xframe(&#39;deny&#39;)); //Same thing</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Simple endpoint</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Time to secure your application...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here are the response headers.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">X-Frame-Options: DENY</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>SameOrigin</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required modules</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Implement X-Frame: SameOrigin</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">xframe</span><span class="p">(</span><span class="s1">&#39;sameorigin&#39;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Simple endpoint</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Time to secure your application...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here are the response headers.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">X-Frame-Options: SAMEORIGIN</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Allow-From</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required modules</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Implement X-Frame: Allow-From</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">xframe</span><span class="p">(</span><span class="s1">&#39;allow-from&#39;</span><span class="p">,</span> <span class="s1">&#39;http://example.com&#39;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Simple endpoint</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Time to secure your application...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here are the response headers.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">X-Frame-Options: ALLOW-FROM http://example.com</span>
</span></code></pre></td></tr></table></div></figure>


<h3>HTTP Strict Transport Security (HSTS)</h3>

<p><a href="http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security">HTTP Strict Transport Security (HSTS)</a> allows a web server to tell user agents to interact with it in the future only over HTTPS. It controls it by defining a period of time with the <code>Strict-Transport-Security</code> response header. This is great if you are running an HTTPS site but still have an HTTP endpoint in order to provide redirection to the HTTPS endpoint. This can help reduce the chance of Man-In-The-Middle (MITM) attacks by reducing the frequency of requests being made over insecure channels.</p>

<p>Helmet provides middleware to help control setting and configuring the HSTS headers. You can specify how long the user agent should make requests over HTTPS and whether or not to include subdomains.</p>

<p>Here it is in action. We are telling it to set the maximum age to 90 days (value is in milliseconds). While the code uses milliseconds, the response header will be in seconds.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required modules</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Implement Strict-Transport-Security</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">hsts</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">maxAge</span><span class="o">:</span> <span class="mi">7776000000</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">includeSubdomains</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Simple endpoint</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Time to secure your application...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here are the response headers.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">Strict-Transport-Security: max-age=7776000; includeSubDomains</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should be aware that this only works if your site is running over HTTPS. The middleware will check to see if <code>req.secure</code> is set to true which is automatically populate by Express.</p>

<h3>Hide X-Powered-By</h3>

<p>By default, Express will add the <code>X-Powered-By</code> header to each response. The actual response header will look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">X-Powered-By: Express</span>
</span></code></pre></td></tr></table></div></figure>


<p>While by itself it doesn&#8217;t cause any security holes, it does give potential attacker useful information. With this information they can focus their attack to exploit known vulnerabilities in Express and Node.</p>

<p>Helmet provides middleware to either strip out the <code>X-Powered-By</code> header or set it to anything else you want.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required modules</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">helmet</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;helmet&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Hide X-Powered-By</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">hidePoweredBy</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Simple endpoint</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Time to secure your application...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Start the server</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mi">3000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you don&#8217;t want to remove the header, you can set it to anything else using.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">helmet</span><span class="p">.</span><span class="nx">hidePoweredBy</span><span class="p">({</span> <span class="nx">setTo</span><span class="o">:</span> <span class="s1">&#39;all your base are belong to us&#39;</span> <span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>Which results in the following response header.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">X-Powered-By: all your base are belong to us</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Other</h3>

<p>There are a few more things Helmet provides. The documentation on the GitHub repository does a good job of explaining them. If you want to learn more, I would suggest checking each of them out.</p>

<ol>
<li><a href="https://github.com/evilpacket/helmet#ie-restrict-untrusted-html-ienoopen">IE, Restrict Untrusted HTML</a></li>
<li><a href="https://github.com/evilpacket/helmet#dont-infer-the-mime-type-nosniff">Don&#8217;t Infer The MIME Type</a></li>
<li><a href="https://github.com/evilpacket/helmet#turn-off-caching-nocache">Turn Off Caching</a> (I would highly advise against this. Caching is very good for web performance.)</li>
<li><a href="https://github.com/evilpacket/helmet#a-restrictive-crossdomainxml-crossdomain">Restrictive Crossdomain.xml</a></li>
</ol>


<h3>Wrap Up</h3>

<p>Helmet is an amazing piece of Express middleware that can help you easily lock down your web application. I would suggest you take the time to better understand the types of attacks and fixes talked about so you can better secure your applications.</p>

<p>I have a lot more tutorials coming so be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Beer Locker: Building a RESTful API with Node - Username &amp; Password]]></title>
    <link href="http://scottksmith.com/blog/2014/09/18/beer-locker-building-a-restful-api-with-node-username-and-password/"/>
    <updated>2014-09-18T20:31:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/09/18/beer-locker-building-a-restful-api-with-node-username-and-password</id>
    <content type="html"><![CDATA[<p>Welcome to part 6 of the Beer Locker series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2014/05/02/building-restful-apis-with-node/">Getting started</a></li>
<li><a href="http://scottksmith.com/blog/2014/05/05/beer-locker-building-a-restful-api-with-node-crud/">CRUD</a></li>
<li><a href="http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/">Passport</a></li>
<li><a href="http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server/">OAuth2 Server</a></li>
<li><a href="http://scottksmith.com/blog/2014/09/14/beer-locker-building-a-restful-api-with-node-digest/">Digest</a></li>
<li><a href="http://scottksmith.com/blog/2014/09/18/beer-locker-building-a-restful-api-with-node-username-and-password/">Username &amp; Password</a></li>
</ol>


<p>In our <a href="http://scottksmith.com/blog/2014/09/14/beer-locker-building-a-restful-api-with-node-digest/">previous article</a> we explored implementing Digest authentication in place of Basic. This article will now delve into implementing username and password authentication using the <a href="https://github.com/jaredhanson/passport-local">passport-local</a> module.</p>

<!-- more -->


<p>There is a new set of code this article will start from rather than where we left off in the previous article. The previous article required us to remove our password hashing which we don&#8217;t have to do for username/password. You can find the starting point of code <a href="https://github.com/scottksmith95/beerlocker/tree/master/beerlocker-6.1">here on GitHub</a>.</p>

<p>The only difference here is that we added back password hashing and verification along with using Basic instead of Digest for our authentication. The Digest strategy implementation is still there but isn&#8217;t being used.</p>

<h2>Username and Password</h2>

<p>One of the most widely used authentication mechanism on the web is via a username and password submitted in a POST request or in the query string.</p>

<p>This authentication mechansim can be used for APIs but it requires submitting the credentials on each call. You could implement session state for your API but it technically goes against REST being stateless. By session state, I mean making a direct login type call with the username and password and getting back some form of session id. This session id can then be transmitted on each API call to allow the server to verify the authenticated user.</p>

<h2>Update our Auth Controller</h2>

<p>To get started with the <code>passport-local</code> module (Local) we need to install it using npm.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install passport-local --save
</span></code></pre></td></tr></table></div></figure>


<p>The next thing we need to do is update our Auth Controller. Open <code>controllers/auth.js</code> and implement the Local strategy as follows.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">LocalStrategy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;passport-local&#39;</span><span class="p">).</span><span class="nx">Strategy</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="k">new</span> <span class="nx">LocalStrategy</span><span class="p">(</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">username</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">User</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">username</span><span class="o">:</span> <span class="nx">username</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// No user found with that username</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Make sure the password is correct</span>
</span><span class='line'>      <span class="nx">user</span><span class="p">.</span><span class="nx">verifyPassword</span><span class="p">(</span><span class="nx">password</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">isMatch</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Password did not match</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">isMatch</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Success</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">isAuthenticated</span> <span class="o">=</span> <span class="nx">passport</span><span class="p">.</span><span class="nx">authenticate</span><span class="p">([</span><span class="s1">&#39;local&#39;</span><span class="p">,</span> <span class="s1">&#39;bearer&#39;</span><span class="p">],</span> <span class="p">{</span> <span class="nx">session</span> <span class="o">:</span> <span class="kc">false</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>We have done 3 main things here.</p>

<p>First, we required the LocalStrategy provided by the <code>passport-local</code> module.</p>

<p>Second, we told Passport to use LocalStrategy. If you are paying close attention, you will notice that the strategy implementation for Local is the same as Basic. This is because we are essentially working with usernames and passwords for both strategies. The main difference here is that the Basic strategy is pulling the username and password out of the Authorization header. Local allows us to submit the username and password via POST data or within the query string.</p>

<p>Third, we updated <code>isAuthenticated</code> to use local instead of basic.</p>

<h2>Test it using query strings</h2>

<p>Yep, you heard me right. We are ready to test out this implementation.</p>

<p>The first way we can test out our new authentication is through the use of query strings. You are welecome to test this using any of the endpoints in our API. I am going to use <code>http://localhost:3000/api/beers/</code>.</p>

<p>Because we are using query strings, it is very simple to test this using a web browser.</p>

<p>Here is what I am using to test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='http'><span class='line'><span class="err">http://localhost:3000/api/beers/?username=denver&amp;password=rocks</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you implemented everything correctly, you should get back a list of beer for the authentication user.</p>

<h2>Test it using POST data</h2>

<p>The next test we can do is using POST data rather than query strings.</p>

<p>This is where things break down a little bit when you don&#8217;t have session state. In calls where we are POSTing, a username and password could be added. But we would be adding them along with other data we are submitting to in the POST. For exampe, when we are adding new beer to our locker, we would be posting beer name, type, and quantity. But we would also be posting a username and password. Also to note that this method only works for POST and PUT. We cannot submit data with GET or DELETE requests.</p>

<p>Here is an example where I am adding a new beer to my locker using Postman.</p>

<p><img src="http://scottksmith.com/images/postman14.png" alt="Testing POST with Postman" /></p>

<h2>Customize our implementation</h2>

<p>As noted before, the Local Strategy is looking to find the credentials in the body or query string parameters named &#8216;username&#8217; and &#8216;password&#8217;. But what if you want to name them something else? You are in luck because you can configure it to specify the name to use for both username and password. This is done by passing in an options object when defining the LocalStrategy.</p>

<p>Open up <code>controllers/auth.js</code> and update it to look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="k">new</span> <span class="nx">LocalStrategy</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">usernameField</span><span class="o">:</span> <span class="s1">&#39;email&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">passwordField</span><span class="o">:</span> <span class="s1">&#39;pass&#39;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">username</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">User</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">username</span><span class="o">:</span> <span class="nx">username</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// No user found with that username</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Make sure the password is correct</span>
</span><span class='line'>      <span class="nx">user</span><span class="p">.</span><span class="nx">verifyPassword</span><span class="p">(</span><span class="nx">password</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">isMatch</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Password did not match</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">isMatch</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Success</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>What this does is tell the LocalStrategy to look for the named parameter &#8216;email&#8217; for the username and &#8216;pass&#8217; for the password.</p>

<h2>Wrap up</h2>

<p>You now have the tools needed to implement username and password authentication.</p>

<p>As stated before, this type of authentication may not make the most sense for a RESTful API. Of the two, query string makes more sense but it is still risky because you are sending the username and password within the URL. Even over an HTTPS connection, it makes it potentially more visible to someone &#8216;watching over your shoulder&#8217;, browser history, etc.</p>

<p>Hopefully this shows you how to use this strategy in other situations such as a web UI with a login form.</p>

<p>I have a lot more tutorials coming so be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>

<p>Source code for this part can be found <a href="https://github.com/scottksmith95/beerlocker/tree/master/beerlocker-6.2">here on GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Beer Locker: Building a RESTful API with Node - Digest]]></title>
    <link href="http://scottksmith.com/blog/2014/09/14/beer-locker-building-a-restful-api-with-node-digest/"/>
    <updated>2014-09-14T13:28:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/09/14/beer-locker-building-a-restful-api-with-node-digest</id>
    <content type="html"><![CDATA[<p>Welcome to part 5 of the Beer Locker series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2014/05/02/building-restful-apis-with-node/">Getting started</a></li>
<li><a href="http://scottksmith.com/blog/2014/05/05/beer-locker-building-a-restful-api-with-node-crud/">CRUD</a></li>
<li><a href="http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/">Passport</a></li>
<li><a href="http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server/">OAuth2 Server</a></li>
<li><a href="http://scottksmith.com/blog/2014/09/14/beer-locker-building-a-restful-api-with-node-digest/">Digest</a></li>
<li><a href="http://scottksmith.com/blog/2014/09/18/beer-locker-building-a-restful-api-with-node-username-and-password/">Username &amp; Password</a></li>
</ol>


<p>In our <a href="http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server/">previous article</a> we ended wtih a functional API capable of creating user accounts, locking down API endpoints, only allowing access to a user&#8217;s own beer locker, and an OAuth2 server.</p>

<p>Many readers have asked questions about how to use different authentication strategies so I am going to continue this series and delve into many of those strategies.</p>

<p>This article will explore the use of Digest authentication instead of Basic.</p>

<!-- more -->


<h2>Digest</h2>

<p>Like the Basic scheme, Digest uses a username and password to authenticate a user. The benefit it provides over Basic is that it uses a challenge-response paradigm to avoid sending the password in the clear.</p>

<p>Here is how it works:</p>

<ol>
<li>Client sends an unauthenticated request to a server.</li>
<li>Server responds with a 401 &#8220;Unauthorized&#8221; reponse code along with a special code (called a nonce) and another string representing the authentication realm.</li>
<li>Client responds with the nonce and an encrypted version of the username, password and realm.</li>
<li>Server responds with a 200 OK and the response data if the authentication passes.</li>
</ol>


<h2>Update our Routes</h2>

<p>There is something odd going on with the way in which we defined our routes in the original tutorials. In most cases it isn&#8217;t an issue but it is for Digest auth. When we tell Express to use our router, we were prefixing it with <code>/api</code>. The problem is that Digest auth uses the URI as part of the scheme and the request object within Express is seeing it without the <code>/api</code> portion of the URI. This will cause authentication to fail. You will need to update <code>server.js</code> routes like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint handlers for /beers</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/api/beers&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">beerController</span><span class="p">.</span><span class="nx">postBeers</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">beerController</span><span class="p">.</span><span class="nx">getBeers</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint handlers for /beers/:beer_id</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/api/beers/:beer_id&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">beerController</span><span class="p">.</span><span class="nx">getBeer</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">beerController</span><span class="p">.</span><span class="nx">putBeer</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">beerController</span><span class="p">.</span><span class="nx">deleteBeer</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint handlers for /users</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/api/users&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">userController</span><span class="p">.</span><span class="nx">postUsers</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">userController</span><span class="p">.</span><span class="nx">getUsers</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint handlers for /clients</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/api/clients&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">clientController</span><span class="p">.</span><span class="nx">postClients</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">clientController</span><span class="p">.</span><span class="nx">getClients</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint handlers for oauth2 authorize</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/api/oauth2/authorize&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">oauth2Controller</span><span class="p">.</span><span class="nx">authorization</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">oauth2Controller</span><span class="p">.</span><span class="nx">decision</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint handlers for oauth2 token</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/api/oauth2/token&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isClientAuthenticated</span><span class="p">,</span> <span class="nx">oauth2Controller</span><span class="p">.</span><span class="nx">token</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Register all our routes</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">router</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Update our Auth Controller</h2>

<p>The first thing we need to do is update our Auth Controller. Open <code>controllers/auth.js</code> and implement the Digest strategy as follows. You can leave the Basic auth strategy implementation if you want. We will be updating the <code>isAuthenticated</code> to use Digest instead of Basic.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">DigestStrategy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;passport-http&#39;</span><span class="p">).</span><span class="nx">DigestStrategy</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="k">new</span> <span class="nx">DigestStrategy</span><span class="p">(</span>
</span><span class='line'>  <span class="p">{</span> <span class="nx">qop</span><span class="o">:</span> <span class="s1">&#39;auth&#39;</span> <span class="p">},</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">username</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">User</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">username</span><span class="o">:</span> <span class="nx">username</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// No user found with that username</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Success</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">user</span><span class="p">,</span> <span class="nx">user</span><span class="p">.</span><span class="nx">password</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">params</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// validate nonces as necessary</span>
</span><span class='line'>    <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">isAuthenticated</span> <span class="o">=</span> <span class="nx">passport</span><span class="p">.</span><span class="nx">authenticate</span><span class="p">([</span><span class="s1">&#39;digest&#39;</span><span class="p">,</span> <span class="s1">&#39;bearer&#39;</span><span class="p">],</span> <span class="p">{</span> <span class="nx">session</span> <span class="o">:</span> <span class="kc">false</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>We have done 3 main things here.</p>

<p>First, we required the DigestStrategy provided by the <code>passport-http</code> module.</p>

<p>Second, we told Passport to use DigestStrategy. Inside this we told it to use <code>qop: 'auth'</code> which is quality of protection along with two anonymous functions. The first function does our verification of the user and if success we call the callback and supply the user along with their password. The second anonymous function can be used to protect against replay attacks. Nonces should be validated to make sure they are not used again. You can do this by storing issued nonces and removing them as they are used. This will increase the security of your authentication.</p>

<p>Third, we updated <code>isAuthenticated</code> to use digest instead of basic.</p>

<h2>Remove hashing of passwords :(</h2>

<p>This is the part of using Digest and more specifically the implementation provided by the <code>passport-http</code> module that I like the least. You cannot store the password as a hash. You need to get to the original password in order for the authentication to work. At the very least you will want to encrypt the password. I highly advise you analyze this type of approach for your application. If you must use Digest, you may want to consider implementing your own Digest strategy or updating the existing one where you don&#8217;t pass in the password in the success callback. You could instead pass in the MD5 hash of the <code>username:realm:password</code> which you have pre calculated and stored.</p>

<p>So on to the very unsafe update to our User model. Again, for the tutorial we are going to store the password in plain text. You NEVER want to do this in a real situation. You will want to look into cryptography modules such as <code>crypto</code> to do this.</p>

<p>Open up <code>models/user.js</code> and update it to look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Define our user schema</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">UserSchema</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">Schema</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">username</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">unique</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">password</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Export the Mongoose model</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">model</span><span class="p">(</span><span class="s1">&#39;User&#39;</span><span class="p">,</span> <span class="nx">UserSchema</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Testing it out</h2>

<p>Fire up your trusted tool such as Postman and create a new user as the old ones will have hashed passwords which will not work.</p>

<p>I found using Postman to test Digest a bit unfriendly so I opted instead for curl.</p>

<p>Here is a command you can use to test your API using Digest:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>curl -v --user smith:smith --digest http://127.0.0.1:3000/api/users
</span></code></pre></td></tr></table></div></figure>


<p>Just change the username:password to whatever you used. This command is great in curl because it will issue the intial unauthenticated request, process the reponse along with the nonce, qop, realm, etc, and finally issue another authenticated request.</p>

<p>Here is what my test looked like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>curl -v --user smith:smith --digest http://127.0.0.1:3000/api/users
</span><span class='line'>
</span><span class='line'>* About to connect<span class="o">()</span> to 127.0.0.1 port 3000 <span class="o">(</span><span class="c">#0)</span>
</span><span class='line'>*   Trying 127.0.0.1...
</span><span class='line'>* Adding handle: conn: 0x7ffb71804000
</span><span class='line'>* Adding handle: send: 0
</span><span class='line'>* Adding handle: recv: 0
</span><span class='line'>* Curl_addHandleToPipeline: length: 1
</span><span class='line'>* - Conn 0 <span class="o">(</span>0x7ffb71804000<span class="o">)</span> send_pipe: 1, recv_pipe: 0
</span><span class='line'>* Connected to 127.0.0.1 <span class="o">(</span>127.0.0.1<span class="o">)</span> port 3000 <span class="o">(</span><span class="c">#0)</span>
</span><span class='line'>* Server auth using Digest with user <span class="s1">&#39;smith&#39;</span>
</span><span class='line'>&gt; GET /api/users HTTP/1.1
</span><span class='line'>&gt; User-Agent: curl/7.30.0
</span><span class='line'>&gt; Host: 127.0.0.1:3000
</span><span class='line'>&gt; Accept: */*
</span><span class='line'>&gt;
</span><span class='line'>&lt; HTTP/1.1 401 Unauthorized
</span><span class='line'>&lt; X-Powered-By: Express
</span><span class='line'>&lt; WWW-Authenticate: Digest <span class="nv">realm</span><span class="o">=</span><span class="s2">&quot;Users&quot;</span>, <span class="nv">nonce</span><span class="o">=</span><span class="s2">&quot;x9hR8HiV9szqnvzUU7DsS5ekfq4xNM2p&quot;</span>, <span class="nv">algorithm</span><span class="o">=</span>MD5, <span class="nv">qop</span><span class="o">=</span><span class="s2">&quot;auth&quot;</span>
</span><span class='line'>&lt; WWW-Authenticate: Bearer <span class="nv">realm</span><span class="o">=</span><span class="s2">&quot;Users&quot;</span>
</span><span class='line'>&lt; Date: Sun, 14 Sep 2014 23:05:02 GMT
</span><span class='line'>&lt; Connection: keep-alive
</span><span class='line'>&lt; Transfer-Encoding: chunked
</span><span class='line'>&lt;
</span><span class='line'>* Ignoring the response-body
</span><span class='line'>* Connection <span class="c">#0 to host 127.0.0.1 left intact</span>
</span><span class='line'>* Issue another request to this URL: <span class="s1">&#39;http://127.0.0.1:3000/api/users&#39;</span>
</span><span class='line'>* Found bundle for host 127.0.0.1: 0x7ffb71415150
</span><span class='line'>* Re-using existing connection! <span class="o">(</span><span class="c">#0) with host 127.0.0.1</span>
</span><span class='line'>* Connected to 127.0.0.1 <span class="o">(</span>127.0.0.1<span class="o">)</span> port 3000 <span class="o">(</span><span class="c">#0)</span>
</span><span class='line'>* Adding handle: conn: 0x7ffb71804000
</span><span class='line'>* Adding handle: send: 0
</span><span class='line'>* Adding handle: recv: 0
</span><span class='line'>* Curl_addHandleToPipeline: length: 1
</span><span class='line'>* - Conn 0 <span class="o">(</span>0x7ffb71804000<span class="o">)</span> send_pipe: 1, recv_pipe: 0
</span><span class='line'>* Server auth using Digest with user <span class="s1">&#39;smith&#39;</span>
</span><span class='line'>&gt; GET /api/users HTTP/1.1
</span><span class='line'>&gt; Authorization: Digest <span class="nv">username</span><span class="o">=</span><span class="s2">&quot;smith&quot;</span>, <span class="nv">realm</span><span class="o">=</span><span class="s2">&quot;Users&quot;</span>, <span class="nv">nonce</span><span class="o">=</span><span class="s2">&quot;x9hR8HiV9szqnvzUU7DsS5ekfq4xNM2p&quot;</span>, <span class="nv">uri</span><span class="o">=</span><span class="s2">&quot;/api/users&quot;</span>, <span class="nv">cnonce</span><span class="o">=</span><span class="s2">&quot;ICAgICAgICAgICAgICAgICAgICAgIDE0MTEzMjk4NDQ=&quot;</span>, <span class="nv">nc</span><span class="o">=</span>00000001, <span class="nv">qop</span><span class="o">=</span>auth, <span class="nv">response</span><span class="o">=</span><span class="s2">&quot;a9b8ab69c3a44c253a7834bdfe45b26d&quot;</span>, <span class="nv">algorithm</span><span class="o">=</span><span class="s2">&quot;MD5&quot;</span>
</span><span class='line'>&gt; User-Agent: curl/7.30.0
</span><span class='line'>&gt; Host: 127.0.0.1:3000
</span><span class='line'>&gt; Accept: */*
</span><span class='line'>&gt;
</span><span class='line'>&lt; HTTP/1.1 200 OK
</span><span class='line'>&lt; X-Powered-By: Express
</span><span class='line'>&lt; Content-Type: application/json
</span><span class='line'>&lt; Content-Length: 354
</span><span class='line'>&lt; ETag: <span class="s2">&quot;-1301455500&quot;</span>
</span><span class='line'>&lt; Date: Sun, 14 Sep 2014 23:05:02 GMT
</span><span class='line'>&lt; Connection: keep-alive
</span><span class='line'>&lt;
</span><span class='line'>* Connection <span class="c">#0 to host 127.0.0.1 left intact</span>
</span><span class='line'><span class="o">[</span>...<span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Wrap up</h2>

<p>You now have the tools needed to implement Digest authentication.</p>

<p>I still strongly caution against the use as it currently stands. I highly dislike and advise against storing passwords encrypted. It is only slightly better than plain text since it is encrypted, but it is only one step away from becoming plain text. The best is to implement your own Digest strategy so you can store your passwords in a way that they can be hashed.</p>

<p>If you have thoughts on this, please share them in the comments section.</p>

<p>I have a lot more tutorials coming so be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>

<p>Source code for this part can be found <a href="https://github.com/scottksmith95/beerlocker/tree/master/beerlocker-5">here on GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[4 Simple Steps To Secure Your Express Node Application]]></title>
    <link href="http://scottksmith.com/blog/2014/09/04/simple-steps-to-secure-your-express-node-application/"/>
    <updated>2014-09-04T21:35:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/09/04/simple-steps-to-secure-your-express-node-application</id>
    <content type="html"><![CDATA[<p>While not an exhaustive article on securing web applications, the four steps shown here will get you pretty far along in building a secure web application.</p>

<!-- more -->


<h3>HTTPS</h3>

<p>One of the first steps you should take to secure your web application is to use HTTPS. For those of you that think it is too hard, too expensive, or too compute intensive, hopefully I can convince you otherwise.</p>

<p>So why would we want to use HTTPS? The number one reason is to keep people and devices from viewing or modifying content being sent and received. There are so many hacks and exploits that can be done when not using a secure connection. It is foolhardy to not use HTTPS.</p>

<p>So how would you get up and running with HTTPS without shelling out a lot of money? Let me introduce you to <a href="http://www.startssl.com/">StartSSL</a>. StartSSL offers free Class 1 certificates you can use to implement HTTPS on your site. While their UI is a bit clunky and cumbersome to work with, the fact that you can get a valid certificate is well worth it.</p>

<h3>Cookies</h3>

<p>Now that you have HTTPS setup and communication to your server is secure, we need to look at securing your cookies. Assuming your web application has some form of authentication, it is likely you are using cookies to maintain session state.</p>

<h4>HttpOnly</h4>

<p>HttpOnly is a flag that can be included in a Set-Cookie response header. The presence of this flag will tell browsers to not allow client side script access to the cookie (if the browser supports it). This is important because it helps protect your cookie data from malicious scripts and helps mitigate the most common XSS attacks.</p>

<p>Here is how you can tell Express to set your cookie using the HttpOnly flag:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">res</span><span class="p">.</span><span class="nx">cookie</span><span class="p">(</span><span class="s1">&#39;sessionid&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">httpOnly</span><span class="o">:</span> <span class="kc">true</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Secure</h4>

<p>Equally important as the HttpOnly flag is the Secure flag. This too is included in a Set-Cookie response header. The presence of the secure flag tells web browsers to only send this cookie in requests going to HTTPS endpoints. This is very important, as the cookie information will not be sent on an unencrypted channel. This helps mitigate some exploits where your browser is redirected to the HTTP endpoint for a site rather than the HTTPS endpoint and thus potentially exposing your cookies to someone in the middle of the traffic.</p>

<p>Here is how you can tell Express to set your cookie using the Secure flag:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">res</span><span class="p">.</span><span class="nx">cookie</span><span class="p">(</span><span class="s1">&#39;sessionid&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">secure</span><span class="o">:</span> <span class="kc">true</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Cross-site Request Forgery</h3>

<p>&#8220;Cross-Site Request Forgery (CSRF) is an attack that tricks the victim into loading a page that contains a malicious request. It is malicious in the sense that it inherits the identity and privileges of the victim to perform an undesired function on the victim&#8217;s behalf, like change the victim&#8217;s e-mail address, home address, or password, or purchase something. CSRF attacks generally target functions that cause a state change on the server but can also be used to access sensitive data.&#8221; - <a href="https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF">Open Web Application Security Project</a>)</p>

<p>To mitigate these types of attacks, you can use a secret, unique and random token that is embedded by the web application in all HTML forms and then verified on the server side when submitted.</p>

<p>Here is how you can implement this protection using Express and Jade:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express-session&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">csrf</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;csurf&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">session</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">secret</span><span class="o">:</span> <span class="s1">&#39;My super session secret&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">cookie</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">httpOnly</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">secure</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">csrf</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">locals</span><span class="p">.</span><span class="nx">_csrf</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">csrfToken</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">next</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='jade'><span class='line'><span class="nt">form</span>(<span class="na">action=</span><span class="s">&#39;/account/profile&#39;</span><span class="err">,</span> <span class="na">method=</span><span class="s">&#39;POST&#39;</span>)
</span><span class='line'>  <span class="nt">input</span>(<span class="na">type=</span><span class="s">&#39;hidden&#39;</span><span class="err">,</span> <span class="na">name=</span><span class="s">&#39;_csrf&#39;</span><span class="err">,</span> <span class="na">value=</span><span class="nv">_csrf</span>)
</span><span class='line'>  <span class="nt">div</span>
</span><span class='line'>    <span class="nt">label</span>(<span class="na">for=</span><span class="s">&#39;username&#39;</span>) Username
</span><span class='line'>    <span class="nt">input</span>(<span class="na">type=</span><span class="s">&#39;text&#39;</span><span class="err">,</span> <span class="na">name=</span><span class="s">&#39;username&#39;</span><span class="err">,</span> <span class="na">id=</span><span class="s">&#39;username&#39;</span>)
</span><span class='line'>  <span class="nt">div</span>
</span><span class='line'>    <span class="nt">input</span>(<span class="na">type=</span><span class="s">&#39;submit&#39;</span><span class="err">,</span> <span class="na">value=</span><span class="s">&#39;Update Profile&#39;</span>)
</span></code></pre></td></tr></table></div></figure>


<p>This example is a little more detailed because we need to see how it all works with Express, Sessions, and our View. The <code>csurf</code> module requires either session middleware or cookie-parser to be initialized first. Learn more about the <code>csurf</code> module <a href="https://www.npmjs.org/package/csurf">here</a> and the <code>express-session</code> module <a href="https://www.npmjs.org/package/express-session">here</a>.</p>

<p>Also worth mentioning (thanks to Evan Johnson for pointing this out) is that XHR requests need to include the CSRF token. Here is an example of how you could do that.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">csrf_token</span> <span class="o">=</span> <span class="s1">&#39;&lt;%= token_value %&gt;&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">$</span><span class="p">(</span><span class="s2">&quot;body&quot;</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="s2">&quot;ajaxSend&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">elm</span><span class="p">,</span> <span class="nx">xhr</span><span class="p">,</span> <span class="nx">s</span><span class="p">){</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">s</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">xhr</span><span class="p">.</span><span class="nx">setRequestHeader</span><span class="p">(</span><span class="s1">&#39;X-CSRF-Token&#39;</span><span class="p">,</span> <span class="nx">csrf_token</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Wrap up</h3>

<p>By taking these first 4 steps, you can help secure your web application. Just using HTTPS alone is a great first step by itself. There are many more things you can and must do in order to fully secure your web applications. Think of this article as the first steps in your long journey to securing your web apps.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using secure cookies in Node on Azure]]></title>
    <link href="http://scottksmith.com/blog/2014/08/22/using-secure-cookies-in-node-on-azure/"/>
    <updated>2014-08-22T12:36:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/08/22/using-secure-cookies-in-node-on-azure</id>
    <content type="html"><![CDATA[<p>In most cases, using secure cookies works just fine. As long as you are using a secure endpoint over HTTPS, the server application will send back cookies to the client with the secure flag set (assuming you have it configured to do so).</p>

<p>When using systems like Heroku and Azure, the secure endpoint is terminated before your application and proxied to you. This means that your application is actually not running on a secure port or protocol. The way your application knows the connection could be considered secure is from the addition of the X-Protocol-Proto header from the proxy.</p>

<!-- more -->


<p>In most cases this is just fine because web application frameworks like Express will watch for this header to know the application is running behind a reverse proxy. If you have configured Express to trust this proxy it will consider the request secure. Once it considers it secure, it will allow the setting of cookies that are marked to be secure.</p>

<p>There is a problem with this on Azure that isn&#8217;t obvious at first. The Azure proxy does not add the X-Protocol-Proto header. Instead it adds x-arr-ssl. This means that even though the request could be considered secure, Express does not know that so it will not set any cookies in the response that are marked as secure.</p>

<p>In order to get secure cookies to work in Azure you will need to trick Express.</p>

<p>What you need to do is add the following anonymous function as middleware before you attempt to set any secure cookies.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">//Tell Express that we&#39;re running behind a</span>
</span><span class='line'><span class="c1">//reverse proxy that supplies https for you</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;trust proxy&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//Add middleware that will trick Express</span>
</span><span class='line'><span class="c1">//into thinking the request is secure</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">headers</span><span class="p">[</span><span class="s1">&#39;x-arr-ssl&#39;</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">req</span><span class="p">.</span><span class="nx">headers</span><span class="p">[</span><span class="s1">&#39;x-forwarded-proto&#39;</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">req</span><span class="p">.</span><span class="nx">headers</span><span class="p">[</span><span class="s1">&#39;x-forwarded-proto&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;https&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">next</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we have done is setup code to watch for the x-arr-ssl header and set the x-forwarded-proto header. Express will now see this header set as https and secure cookies will be sent to the client.</p>

<p>Edit August 23rd, 2014: As mentioned in the comments by Ranjith, there is a setting called enableXFF in the web.config/iisde.yml that can be set to true to enable the addition of the X-Forwarded-Proto header.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Beer Locker: Building a RESTful API with Node - OAuth2 Server]]></title>
    <link href="http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server/"/>
    <updated>2014-07-02T08:23:00-07:00</updated>
    <id>http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server</id>
    <content type="html"><![CDATA[<p>Welcome to part 4 of the Beer Locker series</p>

<ol>
<li><a href="http://scottksmith.com/blog/2014/05/02/building-restful-apis-with-node/">Getting started</a></li>
<li><a href="http://scottksmith.com/blog/2014/05/05/beer-locker-building-a-restful-api-with-node-crud/">CRUD</a></li>
<li><a href="http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/">Passport</a></li>
<li><a href="http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server/">OAuth2 Server</a></li>
<li><a href="http://scottksmith.com/blog/2014/09/14/beer-locker-building-a-restful-api-with-node-digest/">Digest</a></li>
<li><a href="http://scottksmith.com/blog/2014/09/18/beer-locker-building-a-restful-api-with-node-username-and-password/">Username &amp; Password</a></li>
</ol>


<p>In our <a href="http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/">previous article</a> we ended wtih a functional API capable of creating user accounts, locking down API endpoints, and only allowing access to a user&#8217;s own beer locker.</p>

<p>In this part we will dive into creating an OAuth2 server and allowing access to API endpoints for the authorized user or authorized applications. We will do this by integrating <a href="https://github.com/jaredhanson/oauth2orize">OAuth2orize</a> into our application.</p>

<!-- more -->


<h2>Security</h2>

<p>I realized I wasn&#8217;t explicitly clear about what steps ones should take in regards to security. This article was meant more on how to get an OAuth2 server up and running. When implementing an OAuth2 server you MUST make sure to secure your application. This means running all OAuth2 endpoints over HTTPS and hashing the client secret, authorization code, and access token. All three of those values should be treated the same way you would a password for a user account. If you are unsure about how best to secure your applications, you should seek out the assistance of someone who does.</p>

<h2>Application Client</h2>

<p>The first thing we need to do is add a new model, controller, and endpoints to allow us to create new application clients. An application client is what would request access to a user account. Perhaps something like a service that wants to help manage your beer collection to notify you when you are running low.</p>

<p>Create a new file called <code>client.js</code> in the <code>models</code> directory and add the following code to it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Define our client schema</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">ClientSchema</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">Schema</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">unique</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">id</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">secret</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">userId</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Export the Mongoose model</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">model</span><span class="p">(</span><span class="s1">&#39;Client&#39;</span><span class="p">,</span> <span class="nx">ClientSchema</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>There isn&#8217;t too much going on here that differs from what we already did in previous articles. We have a name to help identify the application client. The id and secret are used as part of the OAuth2 flow and should always be kept secret. In this post we aren&#8217;t adding any encryption, but it would be a good practice to hash the secret at the very least. Finally we have a userId field to identify which user owns this application client.</p>

<p>You could also consider auto generating the client id and secret in order to enforce uniqueness, randomness, and strength.</p>

<p>The next thing we will add is the controller to facilitate adding and viewing application clients. Create a new file called <code>client.js</code> in the <code>controllers</code> directory and add the following code to it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Client</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../models/client&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint /api/client for POST</span>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">postClients</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Create a new instance of the Client model</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Client</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Set the client properties that came from the POST data</span>
</span><span class='line'>  <span class="nx">client</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">client</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">client</span><span class="p">.</span><span class="nx">secret</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">secret</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">client</span><span class="p">.</span><span class="nx">userId</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">_id</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Save the client and check for errors</span>
</span><span class='line'>  <span class="nx">client</span><span class="p">.</span><span class="nx">save</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span><span class='line'>      <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">({</span> <span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;Client added to the locker!&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="o">:</span> <span class="nx">client</span> <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint /api/clients for GET</span>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">getClients</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Use the Client model to find all clients</span>
</span><span class='line'>  <span class="nx">Client</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span> <span class="nx">userId</span><span class="o">:</span> <span class="nx">req</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">_id</span> <span class="p">},</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">clients</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span><span class='line'>      <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">(</span><span class="nx">clients</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>These two methods will allow us to create new application clients and get all existing ones for the authenticated user.</p>

<p>Finally, in the <code>server.js</code> file we need to require the new controller and add some new routes for the two endpoints. The new route can be added just after the <code>/users</code> route.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">clientController</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./controllers/client&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint handlers for /clients</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/clients&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">clientController</span><span class="p">.</span><span class="nx">postClients</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">clientController</span><span class="p">.</span><span class="nx">getClients</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Using Postman, let&#8217;s go ahead and create a new application client. If for some reason you forgot your password for your user, you should make a new one by posting to the /users endpoint with username and password.</p>

<p><img src="http://scottksmith.com/images/postman10.png" alt="Postman" /></p>

<h2>Authenticate our application client</h2>

<p>We already created the ability to authenticate a user in our previous article using the BasicStrategy. We need to do the same here so we can lock down our token exchange endpoint which we will implement later.</p>

<p>Update the <code>controllers/auth.js</code> file to require the Client model, add a new BasicStrategy to passport, and setup an export that can be used to verify the client is authenticated.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Client</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../models/client&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="s1">&#39;client-basic&#39;</span><span class="p">,</span> <span class="k">new</span> <span class="nx">BasicStrategy</span><span class="p">(</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">username</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">Client</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">id</span><span class="o">:</span> <span class="nx">username</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">client</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// No client found with that id or bad password</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">client</span> <span class="o">||</span> <span class="nx">client</span><span class="p">.</span><span class="nx">secret</span> <span class="o">!==</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Success</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">client</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">isClientAuthenticated</span> <span class="o">=</span> <span class="nx">passport</span><span class="p">.</span><span class="nx">authenticate</span><span class="p">(</span><span class="s1">&#39;client-basic&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">session</span> <span class="o">:</span> <span class="kc">false</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The one thing to note here is that when we call <code>passport.use()</code> we are not just supplying a BasicStrategy object. Instead we are also giving it the name <code>client-basic</code>. Without this, we would not be able to have two BasicStragies running at the same time.</p>

<p>The actual implementation for our new BasicStrategy is to lookup a client using the supplied client id and verify the password is correct.</p>

<h2>Authorization Codes</h2>

<p>We need to create another model that will store our authorization codes. These are the codes generated in the first part of the OAuth2 flow. These codes are then used in later steps by getting exchanged for access tokens.</p>

<p>Create a new file called <code>code.js</code> in the <code>models</code> directory and add the following code to it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Define our token schema</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">CodeSchema</span>   <span class="o">=</span> <span class="k">new</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">Schema</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">value</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">redirectUri</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">userId</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">clientId</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Export the Mongoose model</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">model</span><span class="p">(</span><span class="s1">&#39;Code&#39;</span><span class="p">,</span> <span class="nx">CodeSchema</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is a pretty simple model with the <code>value</code> field used to store our authorization code. <code>redirectUri</code> is there to store the redirect uri supplied in the initial authorization process so we can add a bit more security later on to make sure the token exchange is legitimate. The <code>userId</code> and <code>clientId</code> fields are used to know what user and application client own this code.</p>

<p>It is also worth noting, that to be extra secure, you should consider hashing the authorization code.</p>

<h2>Access Tokens</h2>

<p>Now we need to create the model that will store our access tokens. Access tokens are the final step in the OAuth2 process. With an access token, an application client is able to make a request on behalf of the user. We will implement the code a little later that creates and validates them.</p>

<p>Create a new file called <code>token.js</code> in the <code>models</code> directory and add the following code to it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Define our token schema</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">TokenSchema</span>   <span class="o">=</span> <span class="k">new</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">Schema</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">value</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">userId</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">clientId</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">String</span><span class="p">,</span> <span class="nx">required</span><span class="o">:</span> <span class="kc">true</span> <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Export the Mongoose model</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">model</span><span class="p">(</span><span class="s1">&#39;Token&#39;</span><span class="p">,</span> <span class="nx">TokenSchema</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>value</code> field will be of the most interest here. It is the actual token value used when accessing the API on behalf of the user. The <code>userId</code> and <code>clientId</code> fields are used to know what user and application client own this token.</p>

<p>Just like we did for user passwords, you should implement a strong hashing scheme for the access token. Never store them as plain text as we are in this example.</p>

<h2>Authentication using access tokens</h2>

<p>Earlier, we added a second BasicStrategy so we can authenticate requests from clients. Now we need to setup  a BearerStategy which will allow us to authenticate requests made on behalf of users via an OAuth token. This is done via the <code>Authorization: Bearer &lt;access token&gt;</code> header.</p>

<p>First we need to install another npm package that will provide us with the BearerStrategy for Passport.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install passport-http-bearer --save
</span></code></pre></td></tr></table></div></figure>


<p>Update the <code>controllers/auth.js</code> file to require the <code>passport-http-bearer</code> package and Token model, add a new BearerStrategy to passport, and setup an export that can be used to verify the application client request is authenticated.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">BearerStrategy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;passport-http-bearer&#39;</span><span class="p">).</span><span class="nx">Strategy</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Token</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../models/token&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">passport</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="k">new</span> <span class="nx">BearerStrategy</span><span class="p">(</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">accessToken</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">Token</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span><span class="nx">value</span><span class="o">:</span> <span class="nx">accessToken</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">token</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// No token found</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">token</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">User</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">_id</span><span class="o">:</span> <span class="nx">token</span><span class="p">.</span><span class="nx">userId</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// No user found</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// Simple example with no scope</span>
</span><span class='line'>        <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">user</span><span class="p">,</span> <span class="p">{</span> <span class="nx">scope</span><span class="o">:</span> <span class="s1">&#39;*&#39;</span> <span class="p">});</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">isBearerAuthenticated</span> <span class="o">=</span> <span class="nx">passport</span><span class="p">.</span><span class="nx">authenticate</span><span class="p">(</span><span class="s1">&#39;bearer&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">session</span><span class="o">:</span> <span class="kc">false</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This new strategy will allow us to accept requests from application clients using OAuth tokens and for us to validate those requests.</p>

<h2>Simple UI for granting application client access</h2>

<p>Up to this point in our series, we have not added any UI. We need to add a simple page with a form that will allow a user to grant or deny access to their account for any application client requesting access.</p>

<p>There are a lot of template engines to pick from like jade, handlebars, ejs, and more.For this series, I went with ejs.</p>

<p>First, we need to install the ejs npm package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install ejs --save
</span></code></pre></td></tr></table></div></figure>


<p>Next, we need to update our express application to tell it to use ejs as its view engine. Add the following require and app.set statements in <code>server.js</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">ejs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;ejs&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create our Express application</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nx">express</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Set view engine to ejs</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;view engine&#39;</span><span class="p">,</span> <span class="s1">&#39;ejs&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, we need to create our view that will let the user grant or deny the application client access to their account.</p>

<p>Create a new directory called <code>views</code> and add a file named <code>dialog.ejs</code>.</p>

<p>Add the following code to the <code>dialog.ejs</code> file.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'>  <span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Beer Locker<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/head&gt;</span>
</span><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;</span>Hi <span class="err">&lt;</span>%= user.username %&gt;!<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;&lt;b&gt;</span><span class="err">&lt;</span>%= client.name %&gt;<span class="nt">&lt;/b&gt;</span> is requesting <span class="nt">&lt;b&gt;</span>full access<span class="nt">&lt;/b&gt;</span> to your account.<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;</span>Do you approve?<span class="nt">&lt;/p&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;form</span> <span class="na">action=</span><span class="s">&quot;/api/oauth2/authorize&quot;</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;input</span> <span class="na">name=</span><span class="s">&quot;transaction_id&quot;</span> <span class="na">type=</span><span class="s">&quot;hidden&quot;</span> <span class="na">value=</span><span class="s">&quot;&lt;%= transactionID %&gt;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;div&gt;</span>
</span><span class='line'>      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">value=</span><span class="s">&quot;Allow&quot;</span> <span class="na">id=</span><span class="s">&quot;allow&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">value=</span><span class="s">&quot;Deny&quot;</span> <span class="na">name=</span><span class="s">&quot;cancel&quot;</span> <span class="na">id=</span><span class="s">&quot;deny&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/form&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>We will come back to this page later as we do a full walkthrough of how everything works. For now, we have this in place and can move on to the next piece.</p>

<h2>Enable sessions for our express application</h2>

<p>OAuth2orize requires session state for the express application in order to properly complete the authorization transaction. In order to do this, we need to install the express-session package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install express-session --save
</span></code></pre></td></tr></table></div></figure>


<p>Next we need to require the package and use it in our express application.</p>

<p>Update <code>server.js</code> with the following code.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express-session&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Set view engine to ejs</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;view engine&#39;</span><span class="p">,</span> <span class="s1">&#39;ejs&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Use the body-parser package in our application</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">bodyParser</span><span class="p">.</span><span class="nx">urlencoded</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">extended</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'><span class="p">}));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Use express session support since OAuth2orize requires it</span>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="nx">session</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">secret</span><span class="o">:</span> <span class="s1">&#39;Super Secret Session Key&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">saveUninitialized</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">resave</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'><span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Create our OAuth2 controller</h2>

<p>We are finally ready to create our OAuth2 controller that will facilitate the OAuth2 flow.</p>

<p>First, install the oauth2orize package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='tcsh'><span class='line'>npm install oauth2orize --save
</span></code></pre></td></tr></table></div></figure>


<p>Next, create a new file called <code>oauth2.js</code> in the <code>controllers</code> directory. We will add the code to this file in steps.</p>

<p><strong>Load required packages</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Load required packages</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">oauth2orize</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;oauth2orize&#39;</span><span class="p">)</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">User</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../models/user&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Client</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../models/client&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Token</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../models/token&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Code</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../models/code&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Create our OAuth2 server</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Create OAuth 2.0 server</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">server</span> <span class="o">=</span> <span class="nx">oauth2orize</span><span class="p">.</span><span class="nx">createServer</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Register serialization and deserialization functions</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Register serialialization function</span>
</span><span class='line'><span class="nx">server</span><span class="p">.</span><span class="nx">serializeClient</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">client</span><span class="p">.</span><span class="nx">_id</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Register deserialization function</span>
</span><span class='line'><span class="nx">server</span><span class="p">.</span><span class="nx">deserializeClient</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">Client</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">_id</span><span class="o">:</span> <span class="nx">id</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">client</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">client</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>When a client redirects a user to user authorization endpoint, an authorization transaction is initiated.  To complete the transaction, the user must authenticate and approve the authorization request.  Because this may involve multiple HTTP request/response exchanges, the transaction is stored in the session.</p>

<p><strong>Register authorization code grant type</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Register authorization code grant type</span>
</span><span class='line'><span class="nx">server</span><span class="p">.</span><span class="nx">grant</span><span class="p">(</span><span class="nx">oauth2orize</span><span class="p">.</span><span class="nx">grant</span><span class="p">.</span><span class="nx">code</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="nx">redirectUri</span><span class="p">,</span> <span class="nx">user</span><span class="p">,</span> <span class="nx">ares</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Create a new authorization code</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">code</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Code</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">value</span><span class="o">:</span> <span class="nx">uid</span><span class="p">(</span><span class="mi">16</span><span class="p">),</span>
</span><span class='line'>    <span class="nx">clientId</span><span class="o">:</span> <span class="nx">client</span><span class="p">.</span><span class="nx">_id</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">redirectUri</span><span class="o">:</span> <span class="nx">redirectUri</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">userId</span><span class="o">:</span> <span class="nx">user</span><span class="p">.</span><span class="nx">_id</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Save the auth code and check for errors</span>
</span><span class='line'>  <span class="nx">code</span><span class="p">.</span><span class="nx">save</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">code</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>OAuth 2.0 specifies a framework that allows users to grant client applications limited access to their protected resources.  It does this through a process of the user granting access, and the client exchanging the grant for an access token.</p>

<p>We are registering here for an authorization code grant type. We create a new authorization code model for the user and application client. It is then stored in MongoDB so we can access it later when exchanging for an access token.</p>

<p><strong>Exchange authorization codes for access tokens</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Exchange authorization codes for access tokens</span>
</span><span class='line'><span class="nx">server</span><span class="p">.</span><span class="nx">exchange</span><span class="p">(</span><span class="nx">oauth2orize</span><span class="p">.</span><span class="nx">exchange</span><span class="p">.</span><span class="nx">code</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="nx">code</span><span class="p">,</span> <span class="nx">redirectUri</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">Code</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">code</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">authCode</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">authCode</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">client</span><span class="p">.</span><span class="nx">_id</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span> <span class="o">!==</span> <span class="nx">authCode</span><span class="p">.</span><span class="nx">clientId</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">redirectUri</span> <span class="o">!==</span> <span class="nx">authCode</span><span class="p">.</span><span class="nx">redirectUri</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Delete auth code now that it has been used</span>
</span><span class='line'>    <span class="nx">authCode</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Create a new access token</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">token</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Token</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">value</span><span class="o">:</span> <span class="nx">uid</span><span class="p">(</span><span class="mi">256</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">clientId</span><span class="o">:</span> <span class="nx">authCode</span><span class="p">.</span><span class="nx">clientId</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">userId</span><span class="o">:</span> <span class="nx">authCode</span><span class="p">.</span><span class="nx">userId</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// Save the access token and check for errors</span>
</span><span class='line'>      <span class="nx">token</span><span class="p">.</span><span class="nx">save</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">token</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}));</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we are doing here is registering for the exchange of authorization codes for access tokens. We first look up to see if we have an authorization code for the one supplied. If we do we perform validation to make sure everything is as it should be. If all is well, we remove the existing authorization code so it cannot be used again and create a new access token. This token is tied to the application client and user. It is finally saved to MongoDB.</p>

<p><strong>User authorization endpoint</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// User authorization endpoint</span>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">authorization</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>  <span class="nx">server</span><span class="p">.</span><span class="nx">authorization</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">clientId</span><span class="p">,</span> <span class="nx">redirectUri</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">Client</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">id</span><span class="o">:</span> <span class="nx">clientId</span> <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">client</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">client</span><span class="p">,</span> <span class="nx">redirectUri</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">}),</span>
</span><span class='line'>  <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">){</span>
</span><span class='line'>    <span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="s1">&#39;dialog&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">transactionID</span><span class="o">:</span> <span class="nx">req</span><span class="p">.</span><span class="nx">oauth2</span><span class="p">.</span><span class="nx">transactionID</span><span class="p">,</span> <span class="nx">user</span><span class="o">:</span> <span class="nx">req</span><span class="p">.</span><span class="nx">user</span><span class="p">,</span> <span class="nx">client</span><span class="o">:</span> <span class="nx">req</span><span class="p">.</span><span class="nx">oauth2</span><span class="p">.</span><span class="nx">client</span> <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>This endpoint, initializes a new authorization transaction. It finds the client requesting access to the user&#8217;s account and then renders the <code>dialog</code> ejs view we created eariler.</p>

<p><strong>User decision endpoint</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// User decision endpoint</span>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">decision</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>  <span class="nx">server</span><span class="p">.</span><span class="nx">decision</span><span class="p">()</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>This endpoint is setup to handle when the user either grants or denies access to their account to the requesting application client. The <code>server.decision()</code> function handles the data submitted by the post and will call the <code>server.grant()</code> function we created earlier if the user granted access.</p>

<p><strong>Application client token exchange endpoint</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Application client token exchange endpoint</span>
</span><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">token</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>  <span class="nx">server</span><span class="p">.</span><span class="nx">token</span><span class="p">(),</span>
</span><span class='line'>  <span class="nx">server</span><span class="p">.</span><span class="nx">errorHandler</span><span class="p">()</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>This endpoint is setup to handle the request made by the application client after they have been granted an authorization code by the user. The <code>server.token()</code> function will initiate a call to the <code>server.exchange()</code> function we created earlier.</p>

<p><strong>Utility functions to generate unique identifiers</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">uid</span> <span class="p">(</span><span class="nx">len</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">buf</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>    <span class="p">,</span> <span class="nx">chars</span> <span class="o">=</span> <span class="s1">&#39;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&#39;</span>
</span><span class='line'>    <span class="p">,</span> <span class="nx">charlen</span> <span class="o">=</span> <span class="nx">chars</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">len</span><span class="p">;</span> <span class="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">buf</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">chars</span><span class="p">[</span><span class="nx">getRandomInt</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">charlen</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">buf</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">getRandomInt</span><span class="p">(</span><span class="nx">min</span><span class="p">,</span> <span class="nx">max</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="p">(</span><span class="nx">max</span> <span class="o">-</span> <span class="nx">min</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="nx">min</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Add routes to OAuth2 endpoints</h2>

<p>Now that we have the controller made for our OAuth2 endpoints, we need to update our express application to add the necessary routes to those endpoints.</p>

<p>In <code>server.js</code> require the new oauth2 controller and add a few new routes.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">oauth2Controller</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./controllers/oauth2&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">...</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint handlers for oauth2 authorize</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/oauth2/authorize&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">oauth2Controller</span><span class="p">.</span><span class="nx">authorization</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isAuthenticated</span><span class="p">,</span> <span class="nx">oauth2Controller</span><span class="p">.</span><span class="nx">decision</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create endpoint handlers for oauth2 token</span>
</span><span class='line'><span class="nx">router</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/oauth2/token&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="nx">authController</span><span class="p">.</span><span class="nx">isClientAuthenticated</span><span class="p">,</span> <span class="nx">oauth2Controller</span><span class="p">.</span><span class="nx">token</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Access token authorization on API endpoints</h2>

<p>At this point we have everything in place for a fully functioal OAuth2 server. The last piece we need is to update our endpoints that require authorization. Currently, we are authorizing with the BasicStrategy which uses username/password. We need to update that to also allow it to use the BearerStrategy which will allow the use of the access token.</p>

<p>Change the <code>exports.isAuthenticated</code> call in <code>controllers/auth.js</code> to use either basic or bearer strategies.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">exports</span><span class="p">.</span><span class="nx">isAuthenticated</span> <span class="o">=</span> <span class="nx">passport</span><span class="p">.</span><span class="nx">authenticate</span><span class="p">([</span><span class="s1">&#39;basic&#39;</span><span class="p">,</span> <span class="s1">&#39;bearer&#39;</span><span class="p">],</span> <span class="p">{</span> <span class="nx">session</span> <span class="o">:</span> <span class="kc">false</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>We are already using the <code>isAuthenticated</code> function on our endpoints so this change will allow authorization with usernamne/password and access tokens.</p>

<h2>Let&#8217;s use our OAuth2 server!</h2>

<p>That was a lot of code! Still far less than it would have been had we not used OAuth2orize.</p>

<p>Now it is time to actually try it out.</p>

<p>Open up your favorite web browser and browse to: <a href="http://localhost:3000/api/oauth2/authorize?client_id=this_is_my_id&amp;response_type=code&amp;redirect_uri=http://localhost:3000">http://localhost:3000/api/oauth2/authorize?client_id=this_is_my_id&amp;response_type=code&amp;redirect_uri=http://localhost:3000</a>. If you used a different client id, then change it in the query string. Also, if you are running on a different port, be sure to change that in both places. When prompted, enter your username and password.</p>

<p><img src="http://scottksmith.com/images/browser1.png" alt="Browser" /></p>

<p>You can test it out by clicking <code>Deny</code> if you want and should see it not continue the OAuth2 flow. Go ahead and click <code>Allow</code> to continue to the next step.</p>

<p><img src="http://scottksmith.com/images/browser2.png" alt="Browser" /></p>

<p>So why did we get a 404? This is part of the tutorial where we are hacking things together a bit. Normally with OAuth2 you would have an endpoint in the application requesting access to a user&#8217;s account. That is the query string <code>redirect_uri</code> that we supplied. So when a user grants access, that URI is requested and passed the authorization code. This then allows the requesting application to exchange that code for an access token.</p>

<p>To continue this tutorial, we will fake an application server using Postman. Go ahead and copy the authorization code from the query string <code>code</code>. Mine in this example would be <code>S7VlbvRQW1aIC5X5</code>.</p>

<p>In Postman, we will want to POST to http://localhost:3000/api/oauth2/token, set the Basic Auth username and password to the client id and client secret for your application client, add set post data values code, grant_type, and redirect_uri. Code needs to be set the code you copied from the browser request. Grant_type needs to be set to authorization_code because that is the type we are using. Redirect_uri needs to be set to the same redirect_uri you used in the authorization code request.</p>

<p><img src="http://scottksmith.com/images/postman11.png" alt="Postman" /></p>

<p>See that <code>value</code> field in the response <code>access_token</code> object? That is our access token which we can now use to make API requests on behalf of the user!</p>

<p>Let&#8217;s test our access token by making a request to our API endpoints.</p>

<p>All you have to do is make GET, POST, PUT, or DELETE requests to the API endpoints we made in earlier tutorials. The only difference is you don&#8217;t have to supply a username or password. Instead, you will add an Authorization header with the value set to <code>Bearer &lt;access token&gt;</code></p>

<p><strong>Add beer to the user&#8217;s locker</strong>
<img src="http://scottksmith.com/images/postman12.png" alt="Postman" /></p>

<p><strong>Get beer from the user&#8217;s locker</strong>
<img src="http://scottksmith.com/images/postman13.png" alt="Postman" /></p>

<p>Feel free to play around a bit. You should be able to alter the access token and find you are unauthorized. Switch back to username and password to verify the user still has access.</p>

<h2>Wrap up</h2>

<p>You now have a fully functional OAuth2 server done with just a little bit of work. <a href="https://github.com/jaredhanson/oauth2orize">OAuth2orize</a> is an amazing library that makes building our server very straightfoward.</p>

<p>I have a lot more tutorials coming so be sure to <a href="http://scottksmith.com/atom.xml">subscribe to my RSS feed</a> or <a href="https://twitter.com/scottksmith95">follow me on Twitter</a>. Also, if there are certain topics you would like me to write on, feel free to leave comments and let me know.</p>

<p>Source code for this part can be found <a href="https://github.com/scottksmith95/beerlocker/tree/master/beerlocker-4">here on GitHub</a>.</p>
]]></content>
  </entry>
  
</feed>
