{"componentChunkName":"component---src-templates-tags-js","path":"/tags/authorisation/","result":{"data":{"allMarkdownRemark":{"totalCount":1,"edges":[{"node":{"id":"a1755fad-910d-5b55-b078-e92f70bf0398","html":"<blockquote>\n<p>As a user I want to be able to login to system using my work account</p>\n</blockquote>\n<p>This is one of the most famous lines in a user story in almost every project’s backlog.</p>\n<!--more-->\n<p>However, sometimes it might be the case that you are responsible to decide which authentication mechanism to be used.</p>\n<div class=\"custom-block info\"><div class=\"custom-block-body\"><strong>Note:</strong> The source code for this post can be found on my <a href=\"https://github.com/yashints/Angular4AzureAD\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub repository</a>.</div></div>\n<p>You might decide to use <a href=\"https://azure.microsoft.com/en-au/services/active-directory/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Azure Active Directory</a> (AAD) and if that’s the case this post will help you to get up to speed with that process. The assumption is that you have a <a href=\"https://en.wikipedia.org/wiki/Single-page_application\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">single page application</a> (SPA) and are using <a href=\"https://docs.microsoft.com/en-us/aspnet/core/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ASP.Net Core</a> Web API as your supporting back-end.</p>\n<p>Also I will assume that you already have an Azure AD setup and have created an application with return URL <code class=\"language-text\">localhost:4200</code>. If you do not know how to do that please read <a href=\"https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-integrating-applications\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this article</a>.</p>\n<div class=\"custom-block info\"><div class=\"custom-block-body\"><strong>Note:</strong> the project structure I use here is not best practice and is only used to show you how you can utilise Azure AD as your authentication mechanism. However, I’ve used it in a large project and it has served me well in the development productivity.</div></div>\n<h2 id=\"setting-up-the-projects\" style=\"position:relative;\"><a href=\"#setting-up-the-projects\" aria-label=\"setting up the projects permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setting up the projects</h2>\n<p>We will need two projects, one for the APIs and one for the client side. I will use <a href=\"https://cli.angular.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Angular CLI</a> for the client side. So let’s create them. I’m also using <a href=\"https://www.visualstudio.com/vs/whatsnew/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Visual Studio 2017</a> but feel free to use <a href=\"https://code.visualstudio.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Visual Studio Code</a> or even command line.</p>\n<p>After creating your solution, you will need to create a web API project targeting .NET CORE 2.0. Do not select an authentication scheme at this time since we will configure it shortly.</p>\n<p>Then create an empty web project and use whatever name you like. For now I’ve used API and Web as my preferred names. Your project structure should look something like this by now:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 902px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 43.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAgX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB1LMyiI0V/8QAGBABAQADAAAAAAAAAAAAAAAAAQAQERL/2gAIAQEAAQUC5bTI5b//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAWEQADAAAAAAAAAAAAAAAAAAAAIVH/2gAIAQIBAT8BUFD/xAAZEAACAwEAAAAAAAAAAAAAAAAAMgEgoZH/2gAIAQEABj8CXRNEjtP/xAAeEAAABAcAAAAAAAAAAAAAAAAAARHwEDFhcZGh0f/aAAgBAQABPyElTQrWFNhwL2NRnH//2gAMAwEAAgADAAAAEKsP/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERUf/aAAgBAwEBPxCPSPT/xAAVEQEBAAAAAAAAAAAAAAAAAAAAcf/aAAgBAgEBPxCCD//EABwQAAEEAwEAAAAAAAAAAAAAAAABESExEEFRcf/aAAgBAQABPxBQwpaUBtLSacjjKvw//9k='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Project Structure\"\n        title=\"\"\n        src=\"/static/9c375beb27b5876574d19300575a8e3f/fc6fd/proj_structure.jpg\"\n        srcset=\"/static/9c375beb27b5876574d19300575a8e3f/6f81f/proj_structure.jpg 270w,\n/static/9c375beb27b5876574d19300575a8e3f/09d21/proj_structure.jpg 540w,\n/static/9c375beb27b5876574d19300575a8e3f/fc6fd/proj_structure.jpg 902w\"\n        sizes=\"(max-width: 902px) 100vw, 902px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h2 id=\"configuring-the-required-services\" style=\"position:relative;\"><a href=\"#configuring-the-required-services\" aria-label=\"configuring the required services permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Configuring the required services</h2>\n<p>Once done open your <code class=\"language-text\">Startup.cs</code> file and navigate to <code class=\"language-text\">ConfigureServices</code> method. If you are wondering why please read my <a href=\"/2017-09-23-authentication-asp-net-core-2-0/\">previous post</a> on the changes in ASP.NET Core 2.0.</p>\n<p>Before we can setup our authentication we need to setup our configuration with the values you gathered when setting up the active directory and the web API application (refer to my previous post). Open your <code class=\"language-text\">appsettings.json</code> and add these lines:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"99707730341887890000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`&quot;AzureAd&quot;: {\r\n  &quot;AADInstance&quot;: &quot;https://login.microsoftonline.com/&quot;,\r\n  &quot;ClientId&quot;: &quot;ca81dd3d-4cd9-4b50-b451-74df7f8838d5&quot;,\r\n  &quot;TenantId&quot;: &quot;db9af0e4-03ec-439b-a75b-01c54a5c9a04&quot;\r\n}`, `99707730341887890000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token property\">\"AzureAd\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token property\">\"AADInstance\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://login.microsoftonline.com/\"</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token property\">\"ClientId\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"ca81dd3d-4cd9-4b50-b451-74df7f8838d5\"</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token property\">\"TenantId\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"db9af0e4-03ec-439b-a75b-01c54a5c9a04\"</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>{: .box-note}\r\n<strong>Note:</strong> remember to replace the application and tenant Id with yours.</p>\n<p>Now navigate to <code class=\"language-text\">ConfigureServices</code> method and add the authentication and authorisation services options as below:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"16533516424354654000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`// Add Authentication services.\r\n//Configure Auth\r\nvar clientId = Configuration[&quot;AzureAd:ClientId&quot;];\r\nvar tenantId = Configuration[&quot;AzureAd:TenantId&quot;];\r\nvar issuer = \\$&quot;https://sts.windows.net/{tenantId}/&quot;;\r\n\r\nvar serviceProvider = services.BuildServiceProvider();\r\nvar loggerFactory = serviceProvider.GetService<ILoggerFactory>();\r\n\r\nservices.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\r\n    .AddJwtBearer(options => {\r\n        options.Authority = &quot;https://login.microsoftonline.com/common/&quot;;\r\n        options.TokenValidationParameters = new TokenValidationParameters\r\n        {\r\n            ValidateIssuer = true,\r\n            ValidIssuer = issuer,\r\n            ValidateAudience = true,\r\n            ValidAudiences = new string[] { clientId },\r\n            ValidateLifetime = true\r\n        };\r\n        options.Events = new MyJwtBearerEvents(loggerFactory.CreateLogger<MyJwtBearerEvents>());\r\n        options.SaveToken = true;\r\n    });\r\n\r\nservices.AddAuthorization();`, `16533516424354654000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-cs line-numbers\"><code class=\"language-cs\"><span class=\"token comment\">// Add Authentication services.</span>\r\n<span class=\"token comment\">//Configure Auth</span>\r\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> clientId <span class=\"token operator\">=</span> Configuration<span class=\"token punctuation\">[</span><span class=\"token string\">\"AzureAd:ClientId\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> tenantId <span class=\"token operator\">=</span> Configuration<span class=\"token punctuation\">[</span><span class=\"token string\">\"AzureAd:TenantId\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> issuer <span class=\"token operator\">=</span> <span class=\"token interpolation-string\"><span class=\"token string\">$\"https://sts.windows.net/</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span><span class=\"token expression language-csharp\">tenantId</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">/\"</span></span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> serviceProvider <span class=\"token operator\">=</span> services<span class=\"token punctuation\">.</span><span class=\"token function\">BuildServiceProvider</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token class-name\"><span class=\"token keyword\">var</span></span> loggerFactory <span class=\"token operator\">=</span> serviceProvider<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">GetService</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>ILoggerFactory<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\nservices<span class=\"token punctuation\">.</span><span class=\"token function\">AddAuthentication</span><span class=\"token punctuation\">(</span>JwtBearerDefaults<span class=\"token punctuation\">.</span>AuthenticationScheme<span class=\"token punctuation\">)</span>\r\n    <span class=\"token punctuation\">.</span><span class=\"token function\">AddJwtBearer</span><span class=\"token punctuation\">(</span>options <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n        options<span class=\"token punctuation\">.</span>Authority <span class=\"token operator\">=</span> <span class=\"token string\">\"https://login.microsoftonline.com/common/\"</span><span class=\"token punctuation\">;</span>\r\n        options<span class=\"token punctuation\">.</span>TokenValidationParameters <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">TokenValidationParameters</span>\r\n        <span class=\"token punctuation\">{</span>\r\n            ValidateIssuer <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\r\n            ValidIssuer <span class=\"token operator\">=</span> issuer<span class=\"token punctuation\">,</span>\r\n            ValidateAudience <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\r\n            ValidAudiences <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\"><span class=\"token keyword\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span> <span class=\"token punctuation\">{</span> clientId <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n            ValidateLifetime <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>\r\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\r\n        options<span class=\"token punctuation\">.</span>Events <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">MyJwtBearerEvents</span><span class=\"token punctuation\">(</span>loggerFactory<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">CreateLogger</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>MyJwtBearerEvents<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n        options<span class=\"token punctuation\">.</span>SaveToken <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\nservices<span class=\"token punctuation\">.</span><span class=\"token function\">AddAuthorization</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>To give you a bit of an intro to the code, we first retrieve the Azure AD configuration. Afterwards, we get an instance of <code class=\"language-text\">ILogger</code> for logging purposes (you can skip this part if you like but you have to remove it from event handler as well).</p>\n<p>That done, we add the authentication to services instance and set a default scheme (in this case I am using <code class=\"language-text\">JwtBearer</code>). Then have to configure our preferred option. This part is very straight forward so I am not going through the whole code.</p>\n<p>You can find the code for <code class=\"language-text\">MyJwtBearerEvents</code> <a href=\"https://github.com/yashints/Angular4AzureAD/blob/master/API/MyJwtBearerEvents.cs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">here</a>.</p>\n<p>It’s time to let ASP.NET Core know it should use authentication. This is an important step since without it the whole setup won’t work. Head to <code class=\"language-text\">Configure</code> method and add the middleware:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"50619689585692115000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`app.UseAuthentication();`, `50619689585692115000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\">app<span class=\"token punctuation\">.</span><span class=\"token function\">UseAuthentication</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>We’re done with configuration at this point, time to secure our API. I’ve got a <code class=\"language-text\">ValuesController</code> which I will add the <code class=\"language-text\">Auhorize</code> attribute to it:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"38944480217386410000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`using System.Collections.Generic;\r\nusing Microsoft.AspNetCore.Mvc;\r\nusing Microsoft.AspNetCore.Authorization;\r\n\r\nnamespace API.Controllers\r\n{\r\n  [Route(&quot;api/[controller]&quot;)]\r\n  [Authorize]\r\n  public class ValuesController : Controller\r\n  {\r\n    // GET api/values\r\n    [HttpGet]\r\n    public IEnumerable&lt;string&gt; Get()\r\n    {\r\n      return new string[] { &quot;value1&quot;, &quot;value2&quot; };\r\n    }\r\n\r\n    //... other methods\r\n  }\r\n}`, `38944480217386410000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">System<span class=\"token punctuation\">.</span>Collections<span class=\"token punctuation\">.</span>Generic</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">Microsoft<span class=\"token punctuation\">.</span>AspNetCore<span class=\"token punctuation\">.</span>Mvc</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">Microsoft<span class=\"token punctuation\">.</span>AspNetCore<span class=\"token punctuation\">.</span>Authorization</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">namespace</span> <span class=\"token namespace\">API<span class=\"token punctuation\">.</span>Controllers</span>\r\n<span class=\"token punctuation\">{</span>\r\n  <span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">Route</span><span class=\"token attribute-arguments\"><span class=\"token punctuation\">(</span><span class=\"token string\">\"api/[controller]\"</span><span class=\"token punctuation\">)</span></span></span><span class=\"token punctuation\">]</span>\r\n  <span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">Authorize</span></span><span class=\"token punctuation\">]</span>\r\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ValuesController</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">Controller</span></span>\r\n  <span class=\"token punctuation\">{</span>\r\n    <span class=\"token comment\">// GET api/values</span>\r\n    <span class=\"token punctuation\">[</span>HttpGet<span class=\"token punctuation\">]</span>\r\n    <span class=\"token keyword\">public</span> IEnumerable<span class=\"token operator\">&amp;</span>lt<span class=\"token punctuation\">;</span><span class=\"token keyword\">string</span><span class=\"token operator\">&amp;</span>gt<span class=\"token punctuation\">;</span> <span class=\"token function\">Get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\"><span class=\"token keyword\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span> <span class=\"token punctuation\">{</span> <span class=\"token string\">\"value1\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"value2\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token punctuation\">}</span>\r\n\r\n    <span class=\"token comment\">//... other methods</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2 id=\"creating-the-client-side\" style=\"position:relative;\"><a href=\"#creating-the-client-side\" aria-label=\"creating the client side permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Creating the client side</h2>\n<p>Alright, now that the server side is secured, let set up our client side to use Azure AD authentication.</p>\n<p>We will start by initialising our project. Head to Web folder and open a console (you will need to have <code class=\"language-text\">nodejs</code>, <code class=\"language-text\">npm</code> and <code class=\"language-text\">AngularCLI</code> installed globally). Run this command to create an application (I am using skip install flag because I need to add some packages before installing the default ones):</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"13784393734651478000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`ng new spa --skip-install`, `13784393734651478000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\">ng new spa --skip-install</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>Now go to spa folder and cut and paste everything to root of the Web folder (this is for simplicity and ease of use). Lets add all the required packages by adding them to <code class=\"language-text\">package.json</code> file. Open it up and add these lines to dependencies section:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"305429110279131800\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`&quot;adal-angular4&quot;: &quot;^1.1.10&quot;,\r\n&quot;bootstrap&quot;: &quot;^3.3.7&quot;,`, `305429110279131800`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token property\">\"adal-angular4\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^1.1.10\"</span><span class=\"token punctuation\">,</span>\r\n<span class=\"token property\">\"bootstrap\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"^3.3.7\"</span><span class=\"token punctuation\">,</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>The <a href=\"https://github.com/benbaran/adal-angular4\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">first package</a> is a wrapper around <a href=\"https://github.com/AzureAD/azure-activedirectory-library-for-js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">adal</a> which is used to authenticate to Azure Active Directory. I will show you how we use it later.</p>\n<p>Now run:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"3223552357133430300\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`npm install`, `3223552357133430300`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>Once finished, we need to define some routes for the application so we can secure a particular one. Protecting routes is a very common task when building applications, as we want to prevent our users from accessing areas that they’re not allowed to access, or, we might want to ask them for confirmation when leaving a certain area. Angular router provides a feature called <strong>Route Guards</strong> that try to solve exactly that problem.</p>\n<p>Here is how our guard looks like:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"16114129209056793000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport { Router, CanActivate, CanActivateChild,\r\n  ActivatedRouteSnapshot, RouterStateSnapshot,\r\n  NavigationExtras }\r\nfrom '@angular/router';\r\nimport { Adal4Service } from 'adal-angular4';\r\n\r\n@Injectable()\r\nexport class AuthGuard implements CanActivate, CanActivateChild {\r\n\r\n  constructor(\r\n    private router: Router,\r\n    private adalSvc: Adal4Service\r\n  ) { }\r\n\r\n  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n    if (this.adalSvc.userInfo.authenticated) {\r\n      return true;\r\n    } else {\r\n      this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });\r\n      return false;\r\n    }\r\n  }\r\n\r\n  canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n    return this.canActivate(childRoute, state);\r\n  }\r\n}`, `16114129209056793000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Injectable <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/core'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Observable <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'rxjs/Observable'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Router<span class=\"token punctuation\">,</span> CanActivate<span class=\"token punctuation\">,</span> CanActivateChild<span class=\"token punctuation\">,</span>\r\n  ActivatedRouteSnapshot<span class=\"token punctuation\">,</span> RouterStateSnapshot<span class=\"token punctuation\">,</span>\r\n  NavigationExtras <span class=\"token punctuation\">}</span>\r\n<span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/router'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Adal4Service <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'adal-angular4'</span><span class=\"token punctuation\">;</span>\r\n\r\n@<span class=\"token function\">Injectable</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AuthGuard</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">CanActivate</span><span class=\"token punctuation\">,</span> CanActivateChild <span class=\"token punctuation\">{</span>\r\n\r\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span>\r\n    <span class=\"token parameter\"><span class=\"token keyword\">private</span> <span class=\"token literal-property property\">router</span><span class=\"token operator\">:</span> Router<span class=\"token punctuation\">,</span>\r\n    <span class=\"token keyword\">private</span> <span class=\"token literal-property property\">adalSvc</span><span class=\"token operator\">:</span> Adal4Service</span>\r\n  <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">canActivate</span><span class=\"token punctuation\">(</span>route<span class=\"token operator\">:</span> ActivatedRouteSnapshot<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">state</span><span class=\"token operator\">:</span> RouterStateSnapshot<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> boolean <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>adalSvc<span class=\"token punctuation\">.</span>userInfo<span class=\"token punctuation\">.</span>authenticated<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\r\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>router<span class=\"token punctuation\">.</span><span class=\"token function\">navigate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'/login'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">queryParams</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">returnUrl</span><span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>url <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token punctuation\">}</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">canActivateChild</span><span class=\"token punctuation\">(</span>childRoute<span class=\"token operator\">:</span> ActivatedRouteSnapshot<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">state</span><span class=\"token operator\">:</span> RouterStateSnapshot<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> boolean <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">canActivate</span><span class=\"token punctuation\">(</span>childRoute<span class=\"token punctuation\">,</span> state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>As you can see I am using one of the packages we added earlier which helps configure our application to authenticate to Azure AD.</p>\n<p>Now that we have our guard, let create our routing (I’ve already added three components to the application called home, login and values):</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"37948372966968754000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { Routes, RouterModule } from '@angular/router'\r\nimport { HomeComponent } from './components/home/home.component'\r\nimport { LoginComponent } from './components/login/login.component'\r\nimport { AuthGuard } from './services/authguard.service'\r\nimport { ValuesComponent } from './components/values/values.component'\r\n\r\nconst appRoutes: Routes = [\r\n  { path: '', component: HomeComponent },\r\n  { path: 'login', component: LoginComponent },\r\n  { path: 'values', component: ValuesComponent, canActivate: [AuthGuard] },\r\n  // otherwise redirect to home\r\n  { path: '**', redirectTo: '' },\r\n]\r\n\r\nexport const routing = RouterModule.forRoot(appRoutes)`, `37948372966968754000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Routes<span class=\"token punctuation\">,</span> RouterModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/router'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> HomeComponent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/home/home.component'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> LoginComponent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/login/login.component'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AuthGuard <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./services/authguard.service'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ValuesComponent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/values/values.component'</span>\r\n\r\n<span class=\"token keyword\">const</span> <span class=\"token literal-property property\">appRoutes</span><span class=\"token operator\">:</span> Routes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\r\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">path</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">component</span><span class=\"token operator\">:</span> HomeComponent <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">path</span><span class=\"token operator\">:</span> <span class=\"token string\">'login'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">component</span><span class=\"token operator\">:</span> LoginComponent <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">path</span><span class=\"token operator\">:</span> <span class=\"token string\">'values'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">component</span><span class=\"token operator\">:</span> ValuesComponent<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">canActivate</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>AuthGuard<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token comment\">// otherwise redirect to home</span>\r\n  <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">path</span><span class=\"token operator\">:</span> <span class=\"token string\">'**'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">redirectTo</span><span class=\"token operator\">:</span> <span class=\"token string\">''</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n<span class=\"token punctuation\">]</span>\r\n\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> routing <span class=\"token operator\">=</span> RouterModule<span class=\"token punctuation\">.</span><span class=\"token function\">forRoot</span><span class=\"token punctuation\">(</span>appRoutes<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Now we can add our routing module to our application. Open the <code class=\"language-text\">app.module.ts</code> file and import and add router to it:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"63490284456488390000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { routing } from './app-routing';\r\n...\r\nimports: [\r\n  routing\r\n]`, `63490284456488390000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> routing <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./app-routing'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token operator\">...</span>\r\n<span class=\"token literal-property property\">imports</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n  routing\r\n<span class=\"token punctuation\">]</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>We will need a login component which will handle the unauthorised requests:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"59579402858205540000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { Component } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Adal4Service } from 'adal-angular4';\r\n\r\n@Component({\r\n  selector: 'app-login',\r\n  templateUrl: './login.component.html',\r\n  styleUrls: ['./login.component.css']\r\n})\r\nexport class LoginComponent {\r\n\r\n  constructor(\r\n    private route: ActivatedRoute,\r\n    private router: Router,\r\n    private adalSvc: Adal4Service\r\n  ) { }\r\n\r\n  login(): void {\r\n    const returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';\r\n\r\n    if (this.adalSvc.userInfo.authenticated) {\r\n      this.router.navigate([returnUrl]);\r\n    } else {\r\n      this.adalSvc.login();\r\n    }\r\n  }\r\n\r\n}`, `59579402858205540000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Component <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/core'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ActivatedRoute<span class=\"token punctuation\">,</span> Router <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/router'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Adal4Service <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'adal-angular4'</span><span class=\"token punctuation\">;</span>\r\n\r\n@<span class=\"token function\">Component</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">selector</span><span class=\"token operator\">:</span> <span class=\"token string\">'app-login'</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">templateUrl</span><span class=\"token operator\">:</span> <span class=\"token string\">'./login.component.html'</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">styleUrls</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'./login.component.css'</span><span class=\"token punctuation\">]</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">LoginComponent</span> <span class=\"token punctuation\">{</span>\r\n\r\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span>\r\n    <span class=\"token parameter\"><span class=\"token keyword\">private</span> <span class=\"token literal-property property\">route</span><span class=\"token operator\">:</span> ActivatedRoute<span class=\"token punctuation\">,</span>\r\n    <span class=\"token keyword\">private</span> <span class=\"token literal-property property\">router</span><span class=\"token operator\">:</span> Router<span class=\"token punctuation\">,</span>\r\n    <span class=\"token keyword\">private</span> <span class=\"token literal-property property\">adalSvc</span><span class=\"token operator\">:</span> Adal4Service</span>\r\n  <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">login</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">const</span> returnUrl <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>route<span class=\"token punctuation\">.</span>snapshot<span class=\"token punctuation\">.</span>queryParams<span class=\"token punctuation\">[</span><span class=\"token string\">'returnUrl'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">||</span> <span class=\"token string\">'/'</span><span class=\"token punctuation\">;</span>\r\n\r\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>adalSvc<span class=\"token punctuation\">.</span>userInfo<span class=\"token punctuation\">.</span>authenticated<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>router<span class=\"token punctuation\">.</span><span class=\"token function\">navigate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>returnUrl<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\r\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>adalSvc<span class=\"token punctuation\">.</span><span class=\"token function\">login</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token punctuation\">}</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Very straightforward, we just call login method on clicking a button. Of course you can do it on load without need to have a button, this will just makes debugging a bit easier.</p>\n<p>At this point let’s add the Azure configuration to our app. First we need to define the same Azure configuration that we used for our ASP.NET Core application. So head to your environments.ts and add them:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"22637188620606750000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`export const environment = {\r\n  production: false,\r\n  azureConfig: {\r\n    tenant: 'tenantname.onmicrosoft.com',\r\n    clientId: 'ca81dd3d-4cd9-4b50-b451-74df7f8838d5',\r\n    postLogoutRedirectUri: 'http://localhost:4200/',\r\n  },\r\n}`, `22637188620606750000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> environment <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">production</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">azureConfig</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token literal-property property\">tenant</span><span class=\"token operator\">:</span> <span class=\"token string\">'tenantname.onmicrosoft.com'</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">clientId</span><span class=\"token operator\">:</span> <span class=\"token string\">'ca81dd3d-4cd9-4b50-b451-74df7f8838d5'</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">postLogoutRedirectUri</span><span class=\"token operator\">:</span> <span class=\"token string\">'http://localhost:4200/'</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>The <code class=\"language-text\">adal-angular4</code> requires the tenant Id and client id (which is the same as application id) and a post back URL. Remember that we’ve set the same when creating the application on Azure AD.</p>\n<p>Alright, time to initialise this service. Open up your <code class=\"language-text\">app.component.ts</code> file and import the <code class=\"language-text\">Adal4Service</code> from this package, then call init method and pass the above config to it:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"5351384578752727000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { Adal4Service } from 'adal-angular4';\r\nimport { Router } from '@angular/router';\r\nimport { environment } from '../environments/environment';\r\n\r\nexport class AppComponent implements OnInit {\r\n  isLoggedIn: boolean = false;\r\n\r\n  constructor(private adalSvc: Adal4Service, private router: Router) {\r\n    this.adalSvc.init(environment.azureConfig);\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.adalSvc.handleWindowCallback();\r\n    this.isLoggedIn = this.adalSvc.userInfo.authenticated;\r\n  }\r\n\r\n  logout(): void {\r\n    this.adalSvc.logOut();\r\n  }\r\n}`, `5351384578752727000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Adal4Service <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'adal-angular4'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Router <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/router'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> environment <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../environments/environment'</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AppComponent</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">OnInit</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">isLoggedIn</span><span class=\"token operator\">:</span> boolean <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token keyword\">private</span> <span class=\"token literal-property property\">adalSvc</span><span class=\"token operator\">:</span> Adal4Service<span class=\"token punctuation\">,</span> <span class=\"token keyword\">private</span> <span class=\"token literal-property property\">router</span><span class=\"token operator\">:</span> Router</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>adalSvc<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span>environment<span class=\"token punctuation\">.</span>azureConfig<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">ngOnInit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>adalSvc<span class=\"token punctuation\">.</span><span class=\"token function\">handleWindowCallback</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isLoggedIn <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>adalSvc<span class=\"token punctuation\">.</span>userInfo<span class=\"token punctuation\">.</span>authenticated<span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">logout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token keyword\">void</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>adalSvc<span class=\"token punctuation\">.</span><span class=\"token function\">logOut</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Because of that post back URL we’ve defined, we also need to handle the login callback coming from Azure AD. We do this by calling <code class=\"language-text\">handleWindowCallback</code> from the aforementioned service on init.</p>\n<p>Let’s define the HTML for the app component as well:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"2420558894456159700\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`<nav class=&quot;navbar navbar-inverse&quot;>\r\n  <div class=&quot;container-fluid&quot;>\r\n    <div class=&quot;navbar-header&quot;>\r\n      <a class=&quot;navbar-brand&quot; href=&quot;#&quot;>SPA App with Azure AD login</a>\r\n    </div>\r\n    <ul class=&quot;nav navbar-nav&quot;>\r\n      <li><a [routerLink]=&quot;['/']&quot;>Home</a></li>\r\n      <li><a [routerLink]=&quot;['/values']&quot;>Values</a></li>\r\n    </ul>\r\n    <ul class=&quot;nav navbar-nav navbar-right&quot;>\r\n      <li *ngIf=&quot;!isLoggedIn&quot;>\r\n        <a [routerLink]=&quot;['/login']&quot;\r\n          ><span class=&quot;glyphicon glyphicon-log-in&quot;></span> Login</a\r\n        >\r\n      </li>\r\n      <li *ngIf=&quot;isLoggedIn&quot;>\r\n        <a (click)=&quot;logout()&quot;\r\n          ><span class=&quot;glyphicon glyphicon-log-out&quot;></span> Logout</a\r\n        >\r\n      </li>\r\n    </ul>\r\n  </div>\r\n</nav>\r\n\r\n<div class=&quot;container-fluid&quot;>\r\n  <div style=&quot;padding-top: 61px;&quot;></div>\r\n  <router-outlet></router-outlet>\r\n</div>`, `2420558894456159700`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>nav</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>navbar navbar-inverse<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>container-fluid<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>navbar-header<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>navbar-brand<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>#<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>SPA App with Azure AD login<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>nav navbar-nav<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">[routerLink]</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>['/']<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Home<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">[routerLink]</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>['/values']<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Values<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>nav navbar-nav navbar-right<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">*ngIf</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>!isLoggedIn<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">[routerLink]</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>['/login']<span class=\"token punctuation\">\"</span></span>\r\n          <span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>glyphicon glyphicon-log-in<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span> Login<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span>\r\n        <span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">*ngIf</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>isLoggedIn<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">(click)</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>logout()<span class=\"token punctuation\">\"</span></span>\r\n          <span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>span</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>glyphicon glyphicon-log-out<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span> Logout<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span>\r\n        <span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>nav</span><span class=\"token punctuation\">></span></span>\r\n\r\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>container-fluid<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token special-attr\"><span class=\"token attr-name\">style</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span><span class=\"token value css language-css\"><span class=\"token property\">padding-top</span><span class=\"token punctuation\">:</span> 61px<span class=\"token punctuation\">;</span></span><span class=\"token punctuation\">\"</span></span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>router-outlet</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>router-outlet</span><span class=\"token punctuation\">></span></span>\r\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>It is very simple. We have a menu which is pointing to our routes, a login/logout button which is shown based on user current status, and the router outlet which will load the correspondent component.</p>\n<p>Let’s create our services which are required to finish our application. First we will need a base service which can extract the token from user object and add it to request header as bearer token:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"43476645872144240000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { Http, Response, Headers } from '@angular/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\n\r\nimport 'rxjs/Rx';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/throw';\r\nimport { Observer } from 'rxjs/Observer';\r\nimport 'rxjs/add/operator/map';\r\nimport 'rxjs/add/operator/catch';\r\n\r\nimport { Adal4Service } from 'adal-angular4';\r\nimport { APP_CONFIG, AppConfig } from '../app.constants';\r\n\r\n@Injectable()\r\nexport class SecureHttpService<T> {\r\n  headers: Headers;\r\n\r\n  constructor(private http: Http, private apiEndPointUrl: string, private adalService: Adal4Service) {\r\n\r\n    this.headers = new Headers({ 'Content-Type': 'application/json' });\r\n    let jwt = this.adalService.userInfo.token;\r\n    this.headers.append('Authorization', 'Bearer ' + jwt);\r\n  }\r\n\r\n  getAll(): Observable<any> {\r\n    return this.http.get(this.apiEndPointUrl, { headers: this.headers }).map(\r\n      (res: Response) => {\r\n        return res.json() as any[];\r\n      }).catch(this.handleError);\r\n  }\r\n\r\n  get(id: number): Observable<any> {\r\n    return this.http.get(this.apiEndPointUrl + '/' + id).map((value, i) => {\r\n      return <T>value.json()\r\n    })\r\n      .catch(this.handleError);\r\n  }\r\n\r\n  private handleError(error: any) {\r\n    console.error('server error:', error);\r\n    if (error instanceof Response) {\r\n      let errMessage = '';\r\n      try {\r\n        errMessage = error.json().error;\r\n      } catch (err) {\r\n        errMessage = error.statusText;\r\n      }\r\n      return Observable.throw(errMessage);\r\n    }\r\n    return Observable.throw(error || 'server error');\r\n  }\r\n}`, `43476645872144240000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Http<span class=\"token punctuation\">,</span> Response<span class=\"token punctuation\">,</span> Headers <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/http'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Inject<span class=\"token punctuation\">,</span> Injectable <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/core'</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">import</span> <span class=\"token string\">'rxjs/Rx'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Observable <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'rxjs/Observable'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token string\">'rxjs/add/observable/throw'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Observer <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'rxjs/Observer'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token string\">'rxjs/add/operator/map'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token string\">'rxjs/add/operator/catch'</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Adal4Service <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'adal-angular4'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> <span class=\"token constant\">APP_CONFIG</span><span class=\"token punctuation\">,</span> AppConfig <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../app.constants'</span><span class=\"token punctuation\">;</span>\r\n\r\n@<span class=\"token function\">Injectable</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SecureHttpService</span><span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">headers</span><span class=\"token operator\">:</span> Headers<span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token keyword\">private</span> <span class=\"token literal-property property\">http</span><span class=\"token operator\">:</span> Http<span class=\"token punctuation\">,</span> <span class=\"token keyword\">private</span> <span class=\"token literal-property property\">apiEndPointUrl</span><span class=\"token operator\">:</span> string<span class=\"token punctuation\">,</span> <span class=\"token keyword\">private</span> <span class=\"token literal-property property\">adalService</span><span class=\"token operator\">:</span> Adal4Service</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>headers <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Headers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token string-property property\">'Content-Type'</span><span class=\"token operator\">:</span> <span class=\"token string\">'application/json'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token keyword\">let</span> jwt <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>adalService<span class=\"token punctuation\">.</span>userInfo<span class=\"token punctuation\">.</span>token<span class=\"token punctuation\">;</span>\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Authorization'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Bearer '</span> <span class=\"token operator\">+</span> jwt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span>any<span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>http<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>apiEndPointUrl<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">headers</span><span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>headers <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>\r\n      <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token literal-property property\">res</span><span class=\"token operator\">:</span> Response</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n        <span class=\"token keyword\">return</span> res<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> any<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\r\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleError<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token function\">get</span><span class=\"token punctuation\">(</span>id<span class=\"token operator\">:</span> number<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span>any<span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>http<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>apiEndPointUrl <span class=\"token operator\">+</span> <span class=\"token string\">'/'</span> <span class=\"token operator\">+</span> id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">value<span class=\"token punctuation\">,</span> i</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n      <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span><span class=\"token constant\">T</span><span class=\"token operator\">></span>value<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n      <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleError<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token keyword\">private</span> <span class=\"token function\">handleError</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token literal-property property\">error</span><span class=\"token operator\">:</span> any</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'server error:'</span><span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>error <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">Response</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n      <span class=\"token keyword\">let</span> errMessage <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\r\n      <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\r\n        errMessage <span class=\"token operator\">=</span> error<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>error<span class=\"token punctuation\">;</span>\r\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n        errMessage <span class=\"token operator\">=</span> error<span class=\"token punctuation\">.</span>statusText<span class=\"token punctuation\">;</span>\r\n      <span class=\"token punctuation\">}</span>\r\n      <span class=\"token keyword\">return</span> Observable<span class=\"token punctuation\">.</span><span class=\"token function\">throw</span><span class=\"token punctuation\">(</span>errMessage<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n    <span class=\"token punctuation\">}</span>\r\n    <span class=\"token keyword\">return</span> Observable<span class=\"token punctuation\">.</span><span class=\"token function\">throw</span><span class=\"token punctuation\">(</span>error <span class=\"token operator\">||</span> <span class=\"token string\">'server error'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>I am using a generic class which can be used later using <a href=\"https://www.typescriptlang.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">TypeScript</a> features (which I love). In the constructor we need an instance of <code class=\"language-text\">HTTP</code> service, the base URL and the <code class=\"language-text\">Adal4Service</code> to extract the token from.</p>\n<p>Now let’s add our values service:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"41054761428516454000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { Injectable, Inject } from '@angular/core'\r\nimport { Http } from '@angular/http'\r\nimport { APP_CONFIG, AppConfig } from '../app.constants'\r\nimport { Adal4Service } from 'adal-angular4'\r\nimport { SecureHttpService } from './secure-http.service'\r\n\r\n@Injectable()\r\nexport class ValuesService extends SecureHttpService<string> {\r\n  constructor(\r\n    http: Http,\r\n    @Inject(APP_CONFIG) appConfig: AppConfig,\r\n    adalService: Adal4Service\r\n  ) {\r\n    super(http, appConfig.baseUrl + 'values', adalService)\r\n  }\r\n}`, `41054761428516454000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Injectable<span class=\"token punctuation\">,</span> Inject <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/core'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Http <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/http'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> <span class=\"token constant\">APP_CONFIG</span><span class=\"token punctuation\">,</span> AppConfig <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../app.constants'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Adal4Service <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'adal-angular4'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> SecureHttpService <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./secure-http.service'</span>\r\n\r\n@<span class=\"token function\">Injectable</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ValuesService</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">SecureHttpService</span><span class=\"token operator\">&lt;</span>string<span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span>\r\n    <span class=\"token parameter\"><span class=\"token literal-property property\">http</span><span class=\"token operator\">:</span> Http<span class=\"token punctuation\">,</span>\r\n    @<span class=\"token function\">Inject</span><span class=\"token punctuation\">(</span><span class=\"token constant\">APP_CONFIG</span><span class=\"token punctuation\">)</span> appConfig<span class=\"token operator\">:</span> AppConfig<span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">adalService</span><span class=\"token operator\">:</span> Adal4Service</span>\r\n  <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>http<span class=\"token punctuation\">,</span> appConfig<span class=\"token punctuation\">.</span>baseUrl <span class=\"token operator\">+</span> <span class=\"token string\">'values'</span><span class=\"token punctuation\">,</span> adalService<span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Now you know what was the benefit of having that generic class, it’s superb isn’t it?</p>\n<div class=\"custom-block info\"><div class=\"custom-block-body\"><strong>Note:</strong> I am using an config object which can be injected anywhere.</div></div>\n<p>The source code for that is very simple:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"69311090895422865000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { InjectionToken, NgModule } from '@angular/core'\r\n\r\nexport class AppConfig {\r\n  baseUrl: string\r\n}\r\n\r\nexport const APP_CONSTANTS: AppConfig = {\r\n  baseUrl: 'http://localhost:4200/api/',\r\n}\r\n\r\nexport let APP_CONFIG = new InjectionToken() < AppConfig > 'app.config'\r\n\r\n@NgModule({\r\n  providers: [\r\n    {\r\n      provide: APP_CONFIG,\r\n      useValue: APP_CONSTANTS,\r\n    },\r\n  ],\r\n})\r\nexport class AppConfigModule {}`, `69311090895422865000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> InjectionToken<span class=\"token punctuation\">,</span> NgModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/core'</span>\r\n\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AppConfig</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">baseUrl</span><span class=\"token operator\">:</span> string\r\n<span class=\"token punctuation\">}</span>\r\n\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token constant\">APP_CONSTANTS</span><span class=\"token operator\">:</span> AppConfig <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">baseUrl</span><span class=\"token operator\">:</span> <span class=\"token string\">'http://localhost:4200/api/'</span><span class=\"token punctuation\">,</span>\r\n<span class=\"token punctuation\">}</span>\r\n\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">let</span> <span class=\"token constant\">APP_CONFIG</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">InjectionToken</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> AppConfig <span class=\"token operator\">></span> <span class=\"token string\">'app.config'</span>\r\n\r\n@<span class=\"token function\">NgModule</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">providers</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token literal-property property\">provide</span><span class=\"token operator\">:</span> <span class=\"token constant\">APP_CONFIG</span><span class=\"token punctuation\">,</span>\r\n      <span class=\"token literal-property property\">useValue</span><span class=\"token operator\">:</span> <span class=\"token constant\">APP_CONSTANTS</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AppConfigModule</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Alright, time to consume the values service in the values component:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"40164968308270940000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { Component } from '@angular/core';\r\nimport { ValuesService } from '../../services/values.service';\r\n\r\n@Component({\r\n  selector: 'app-values',\r\n  templateUrl: './values.component.html',\r\n  styleUrls: ['./values.component.css']\r\n})\r\nexport class ValuesComponent {\r\n  values: Array<string>;\r\n\r\n  constructor(private service: ValuesService) {\r\n    this.service.getAll().subscribe(x => this.values = x);\r\n  }\r\n}`, `40164968308270940000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Component <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/core'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ValuesService <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../../services/values.service'</span><span class=\"token punctuation\">;</span>\r\n\r\n@<span class=\"token function\">Component</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">selector</span><span class=\"token operator\">:</span> <span class=\"token string\">'app-values'</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">templateUrl</span><span class=\"token operator\">:</span> <span class=\"token string\">'./values.component.html'</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">styleUrls</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'./values.component.css'</span><span class=\"token punctuation\">]</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">ValuesComponent</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">values</span><span class=\"token operator\">:</span> Array<span class=\"token operator\">&lt;</span>string<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token keyword\">private</span> <span class=\"token literal-property property\">service</span><span class=\"token operator\">:</span> ValuesService</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>service<span class=\"token punctuation\">.</span><span class=\"token function\">getAll</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">subscribe</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>values <span class=\"token operator\">=</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>And the HTML:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"77822185331902410000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`<div class=&quot;col-xs-12&quot;>\r\n  <h1>You're in, well done...</h1>\r\n  <div class=&quot;well&quot;>\r\n    <ul>\r\n      <li *ngFor=&quot;let value of values&quot;>{{value}}</li>\r\n    </ul>\r\n  </div>\r\n</div>`, `77822185331902410000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-html line-numbers\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>col-xs-12<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span>You're in, well done...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>well<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\r\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">*ngFor</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>let value of values<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>{{value}}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\r\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span>\r\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\r\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2 id=\"finishing-touches\" style=\"position:relative;\"><a href=\"#finishing-touches\" aria-label=\"finishing touches permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Finishing touches</h2>\n<p>It is not time to glue everything together. Open your app.module.ts and add all the services you need (components will get added when you add them using <code class=\"language-text\">ng g component</code> command):</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"32436215266757860000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { BrowserModule } from '@angular/platform-browser'\r\nimport { NgModule } from '@angular/core'\r\nimport { Adal4Service, Adal4HTTPService } from 'adal-angular4'\r\nimport { HttpModule, Http } from '@angular/http'\r\nimport { AppComponent } from './app.component'\r\nimport { HomeComponent } from './components/home/home.component'\r\nimport { LoginComponent } from './components/login/login.component'\r\nimport { ValuesComponent } from './components/values/values.component'\r\nimport { AppConfigModule } from './app.constants'\r\nimport { AuthGuard } from './services/authguard.service'\r\nimport { routing } from './app-routing'\r\nimport { ValuesService } from './services/values.service'\r\nimport { SecureHttpService } from './services/secure-http.service'\r\n\r\n@NgModule({\r\n  declarations: [AppComponent, HomeComponent, LoginComponent, ValuesComponent],\r\n  imports: [BrowserModule, AppConfigModule, HttpModule, routing],\r\n  providers: [\r\n    AuthGuard,\r\n    SecureHttpService,\r\n    ValuesService,\r\n    Adal4Service,\r\n    {\r\n      provide: Adal4HTTPService,\r\n      useFactory: Adal4HTTPService.factory,\r\n      deps: [Http, Adal4Service],\r\n    },\r\n  ],\r\n  bootstrap: [AppComponent],\r\n})\r\nexport class AppModule {}`, `32436215266757860000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-javascript line-numbers\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> BrowserModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/platform-browser'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> NgModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/core'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Adal4Service<span class=\"token punctuation\">,</span> Adal4HTTPService <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'adal-angular4'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> HttpModule<span class=\"token punctuation\">,</span> Http <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@angular/http'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AppComponent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./app.component'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> HomeComponent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/home/home.component'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> LoginComponent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/login/login.component'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ValuesComponent <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/values/values.component'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AppConfigModule <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./app.constants'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> AuthGuard <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./services/authguard.service'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> routing <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./app-routing'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ValuesService <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./services/values.service'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> SecureHttpService <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./services/secure-http.service'</span>\r\n\r\n@<span class=\"token function\">NgModule</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">declarations</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>AppComponent<span class=\"token punctuation\">,</span> HomeComponent<span class=\"token punctuation\">,</span> LoginComponent<span class=\"token punctuation\">,</span> ValuesComponent<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">imports</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>BrowserModule<span class=\"token punctuation\">,</span> AppConfigModule<span class=\"token punctuation\">,</span> HttpModule<span class=\"token punctuation\">,</span> routing<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">providers</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\r\n    AuthGuard<span class=\"token punctuation\">,</span>\r\n    SecureHttpService<span class=\"token punctuation\">,</span>\r\n    ValuesService<span class=\"token punctuation\">,</span>\r\n    Adal4Service<span class=\"token punctuation\">,</span>\r\n    <span class=\"token punctuation\">{</span>\r\n      <span class=\"token literal-property property\">provide</span><span class=\"token operator\">:</span> Adal4HTTPService<span class=\"token punctuation\">,</span>\r\n      <span class=\"token literal-property property\">useFactory</span><span class=\"token operator\">:</span> Adal4HTTPService<span class=\"token punctuation\">.</span>factory<span class=\"token punctuation\">,</span>\r\n      <span class=\"token literal-property property\">deps</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>Http<span class=\"token punctuation\">,</span> Adal4Service<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">bootstrap</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>AppComponent<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AppModule</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>As you can see we’ve provided all the required service we added. Also configured the <code class=\"language-text\">Adal4HTTPService</code> which then will get used by <code class=\"language-text\">Adal4Service</code> and specified its dependencies.</p>\n<h2 id=\"proxy\" style=\"position:relative;\"><a href=\"#proxy\" aria-label=\"proxy permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Proxy</h2>\n<p>Since we are using two different project we will need to let Angular CLI know when to delegate the requests to our ASP.NET Core APIs. For that you can simply create a proxy and use it when using <code class=\"language-text\">ng serve</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"88250094179823520000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{\r\n  &quot;/api&quot;: {\r\n    &quot;target&quot;: &quot;http://localhost:51009/&quot;,\r\n    &quot;secure&quot;: false\r\n  }\r\n}`, `88250094179823520000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-json line-numbers\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\r\n  <span class=\"token property\">\"/api\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token property\">\"target\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"http://localhost:51009/\"</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token property\">\"secure\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span>\r\n  <span class=\"token punctuation\">}</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>The port defined above need to be the port that is used to lunch you API application. Also you will need to let ng know it should use a proxy. Open your <code class=\"language-text\">package.json</code> and replace <code class=\"language-text\">ng serve</code> with:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"60709800270056790000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`ng serve --proxy-config proxy.conf.json`, `60709800270056790000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\">ng serve --proxy-config proxy.conf.json</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>Now run <code class=\"language-text\">dotnet run</code> in root of APIs and run <code class=\"language-text\">npm start</code> from the root of the Web folder. And it is all done. When you click on values menu you will be redirected to your Azure AD where you can login and then you will be redirected back to your application and the values will be loaded.</p>\n<p>Hope you will benefit from this post and remember to spread it (<a href=\"https://goo.gl/LnbzSB\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">short link</a>) where you see fit.</p>\n<p>Again the complete source code can be found on my <a href=\"https://github.com/yashints/Angular4AzureAD\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub repository</a>.</p>\n<p>Hope you’ve enjoyed this article.</p>","timeToRead":11,"frontmatter":{"title":"Integrating your SPA with Azure AD","unformattedDate":"2017-09-28 15:10","date":"Sep 28, 2017","path":"integrating-spa-azure-ad/","author":"Yaser Adel Mehraban","tags":["angular","aspnetcore","authentication","authorisation","azureactivedirectory","security","spa"],"thumbnail":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABRUlEQVR42o1QTUvDQBDNn/PkwUt/g4fePQpKQRBRvHjsKSheBIXSCgW1lnqwiEitSWuTSm2iMRvopkma7s5sXROtxYL6GJbd2fcxjDKZA6CwKNdt2np29Z5rejGNUfbFHFP58UYhrAFrOrH2Oto6d4ra4NEduwH8IU7/OIp6P1Zv/Y7HcmekoAWGx0gI/0pmjDV75FJ3IgYxR1lDhgxEMhSigNn6EAvxbQoAoyjgbCSbgDD5FYpkSx4iykva4iBdP41mqTR2LL/lRJ2XsG37bRL1FEJIo9EwTZNSKhJMNZE/EEm4NJdnqbu7Vl5YPVpaP87kyov5u6zieZ5hGNVqNQzDND+dRWJI3pDzqbjY3dm+yujth1rleq+SzTeXFbkhmamqqm3b6cL4F6jr8PEYk1kETGrWwf79yk2/dHpxcljfKDxtvgO47PfJbtLflwAAAABJRU5ErkJggg=="},"backgroundColor":"transparent","images":{"fallback":{"src":"/static/e428f44570985d8b21321d2f036238ae/ec741/basics_of_auth_in_aad.png","srcSet":"/static/e428f44570985d8b21321d2f036238ae/ec741/basics_of_auth_in_aad.png 656w","sizes":"(min-width: 656px) 656px, 100vw"},"sources":[{"srcSet":"/static/e428f44570985d8b21321d2f036238ae/760cf/basics_of_auth_in_aad.webp 656w","type":"image/webp","sizes":"(min-width: 656px) 656px, 100vw"}]},"width":656,"height":297}}}}}}]}},"pageContext":{"tag":"authorisation"}},"staticQueryHashes":[],"slicesMap":{}}