In the previous post, I showed you how to create a token in ASP.NET Core. Now I will show you how you can use it in a project that uses Angular.
Example
In the beginning, let’s create an angular project with the command ng new App-SPA –style=scss –routing (in the future I plan to write a bit more about Angular).
Let’s create a service that will get the token from API and after obtaining it, save it to localstorage.
baseurl – there is our api on port 5000
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Injectable() export class AuthService { baseUrl = 'http://localhost:5000/'; constructor(private http: HttpClient) { } getAndSaveToken() { this.http.post(this.baseUrl + 'api/auth', null).subscribe((response: any) => { if (response) { localStorage.setItem('token', response.token); } }); } }
Let’s remind what the action to create a token looks like in API.
[HttpPost] public IActionResult Authorize() { var claims = new [] { new Claim(ClaimTypes.NameIdentifier, "Some identifier"), new Claim(ClaimTypes.DateOfBirth, DateTime.Now.AddYears(-25).ToShortDateString()) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.GetSection("AppSettings:TokenSecret").Value)); var credentials = new SigningCredentials(key,SecurityAlgorithms.HmacSha512); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), Expires = DateTime.Now.AddHours(1), SigningCredentials = credentials }; var tokenHandler = new JwtSecurityTokenHandler(); var token = tokenHandler.CreateToken(tokenDescriptor); return Ok(new {token= tokenHandler.WriteToken(token)}); }
After calling the method from the AuthService, we see that our token has been saved there.
*do not forget to add the CORS service to API.
services.AddCors(); /// app.UseCors(x=>x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
To decode token I will use the library angular2-jwt. So let’s install it by npm install @auth/angular-jwt.
At first creat object jwtHelper.
jwtHelper = new JwtHelperService();
Then you can easily use it to decode the token.
decodeToken() { const token = localStorage.getItem('token'); if (token) { return this.jwtHelper.decodeToken(token); } }
Or seeing if the token did not expire.
tokenExistAndNotExpire() { const token = localStorage.getItem('token'); return !this.jwtHelper.isTokenExpired(token); }
For testing the operation of the application I created a very simple html view with a button that get and saves the token to localstorage. Additionally, nameid (from claims) is displayed if the token has not expired.
<h1 class="d-flex justify-content-center align-items-center vertical-center" *ngIf="tokenExist()">Hi! <b> {{decodedToken?.nameid}} </b></h1> <div class="d-flex justify-content-center align-items-center vertical-center" style="height:100px;"> <div class="form-group"> <button class="btn btn-success" (click)="getToken()">Get and save token</button> </div> </div>
App-component.ts looks like below.
import { AuthService } from './_services/AuthService.service'; import { Component, OnInit } from '@angular/core'; import { JwtHelperService } from '@auth0/angular-jwt'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'] }) export class AppComponent implements OnInit { constructor(private authService: AuthService) { } jwtHelper = new JwtHelperService(); decodedToken: any; ngOnInit() { this.decodedToken = this.authService.decodeToken(); } getToken() { this.authService.getAndSaveToken(); } tokenExist() { this.decodedToken = this.authService.decodeToken(); return this.authService.tokenExistAndNotExpire(); } }
And it presents it as follows:
In the next post I will describe the mechanics of the auth guard.
Whole code on github.
Lekki i przyjemny artykuł. Sam jestem na etapie poznawania angulara. Zapraszam do siebie na bloga.