guard
This commit is contained in:
		
							parent
							
								
									f655a6843f
								
							
						
					
					
						commit
						e248faba74
					
				
					 14 changed files with 129 additions and 6 deletions
				
			
		
							
								
								
									
										11
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										11
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							|  | @ -17,6 +17,7 @@ | |||
|         "@angular/platform-browser-dynamic": "~13.0.0", | ||||
|         "@angular/router": "~13.0.0", | ||||
|         "bootstrap": "^5.1.3", | ||||
|         "jwt-decode": "^3.1.2", | ||||
|         "rxjs": "~7.4.0", | ||||
|         "tslib": "^2.3.0", | ||||
|         "underscore": "^1.13.1", | ||||
|  | @ -7733,6 +7734,11 @@ | |||
|         "safe-buffer": "^5.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/jwt-decode": { | ||||
|       "version": "3.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", | ||||
|       "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" | ||||
|     }, | ||||
|     "node_modules/karma": { | ||||
|       "version": "6.3.9", | ||||
|       "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz", | ||||
|  | @ -19833,6 +19839,11 @@ | |||
|         "safe-buffer": "^5.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "jwt-decode": { | ||||
|       "version": "3.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", | ||||
|       "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" | ||||
|     }, | ||||
|     "karma": { | ||||
|       "version": "6.3.9", | ||||
|       "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz", | ||||
|  |  | |||
|  | @ -20,6 +20,7 @@ | |||
|     "@angular/platform-browser-dynamic": "~13.0.0", | ||||
|     "@angular/router": "~13.0.0", | ||||
|     "bootstrap": "^5.1.3", | ||||
|     "jwt-decode": "^3.1.2", | ||||
|     "rxjs": "~7.4.0", | ||||
|     "tslib": "^2.3.0", | ||||
|     "underscore": "^1.13.1", | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ | |||
|                 <a routerLink="account" routerLinkActive="active-custom" class="nav-link">Compte utilisateur</a> | ||||
|                 <a routerLink="account/signin" routerLinkActive="active-custom" class="nav-link">Se connecter</a> | ||||
|                 <a routerLink="account/signup" routerLinkActive="active-custom" class="nav-link">S'inscrire</a> | ||||
|                 <a routerLink="account/user" routerLinkActive="active-custom" class="nav-link">Mon compte</a> | ||||
|                 <a class="nav-link">Panier</a> | ||||
|                 <a class="nav-link disabled">Plus d'option bientôt</a> | ||||
|                 <a class="nav-link disabled" *ngIf="likeCounter == 0"> Pas de plante likée</a> | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| import { NgModule } from '@angular/core'; | ||||
| import { RouterModule, Routes } from '@angular/router'; | ||||
| import { any } from 'underscore'; | ||||
| import { AuthGuard } from './auth.guard'; | ||||
| import { PageAccountComponent } from './pages/page-account/page-account.component'; | ||||
| import { PageForgotPasswordComponent } from './pages/page-forgot-password/page-forgot-password.component'; | ||||
| import { PageResetPasswordComponent } from './pages/page-reset-password/page-reset-password.component'; | ||||
| import { PageSigninComponent } from './pages/page-signin/page-signin.component'; | ||||
|  | @ -11,7 +13,8 @@ const routes: Routes = [ | |||
|   { path: 'signin', component: PageSigninComponent }, | ||||
|   { path: 'signup', component: PageSignupnComponent }, | ||||
|   { path: 'forgot-password', component: PageForgotPasswordComponent }, | ||||
|   { path: 'reset-password', component: PageResetPasswordComponent } | ||||
|   { path: 'reset-password', component: PageResetPasswordComponent }, | ||||
|   { path: 'user', canActivate: [AuthGuard], component: PageAccountComponent } | ||||
| ]; | ||||
| 
 | ||||
| @NgModule({ | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ import { PageSignupnComponent } from './pages/page-signupn/page-signupn.componen | |||
| import { PageForgotPasswordComponent } from './pages/page-forgot-password/page-forgot-password.component'; | ||||
| import { PageResetPasswordComponent } from './pages/page-reset-password/page-reset-password.component'; | ||||
| import { FormsModule, ReactiveFormsModule } from '@angular/forms'; | ||||
| import { PageAccountComponent } from './pages/page-account/page-account.component'; | ||||
| 
 | ||||
| 
 | ||||
| @NgModule({ | ||||
|  | @ -14,7 +15,8 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; | |||
|     PageSigninComponent, | ||||
|     PageSignupnComponent, | ||||
|     PageForgotPasswordComponent, | ||||
|     PageResetPasswordComponent | ||||
|     PageResetPasswordComponent, | ||||
|     PageAccountComponent | ||||
|   ], | ||||
|   imports: [ | ||||
|     CommonModule, | ||||
|  |  | |||
							
								
								
									
										16
									
								
								src/app/modules/account/auth.guard.spec.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/app/modules/account/auth.guard.spec.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| import { TestBed } from '@angular/core/testing'; | ||||
| 
 | ||||
| import { AuthGuard } from './auth.guard'; | ||||
| 
 | ||||
| describe('AuthGuard', () => { | ||||
|   let guard: AuthGuard; | ||||
| 
 | ||||
|   beforeEach(() => { | ||||
|     TestBed.configureTestingModule({}); | ||||
|     guard = TestBed.inject(AuthGuard); | ||||
|   }); | ||||
| 
 | ||||
|   it('should be created', () => { | ||||
|     expect(guard).toBeTruthy(); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										36
									
								
								src/app/modules/account/auth.guard.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/app/modules/account/auth.guard.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | |||
| import { Injectable } from '@angular/core'; | ||||
| import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; | ||||
| import { Observable } from 'rxjs'; | ||||
| import { environment } from 'src/environments/environment'; | ||||
| import jwt_decode from 'jwt-decode'; | ||||
| 
 | ||||
| @Injectable({ | ||||
|   providedIn: 'root' | ||||
| }) | ||||
| export class AuthGuard implements CanActivate { | ||||
|   private tokenKey: string; | ||||
|   constructor(private router: Router) { | ||||
|     this.tokenKey = environment.tokenKey; | ||||
|   } | ||||
|   canActivate( | ||||
|     route: ActivatedRouteSnapshot, | ||||
|     state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree { | ||||
|       const token = localStorage.getItem(this.tokenKey); | ||||
|       if(token) { | ||||
|         const decodedToken = jwt_decode<any>(token); | ||||
|         if(decodedToken.exp) { | ||||
|           const dateExp = new Date(decodedToken.exp * 1000); | ||||
|             if(new Date() >= dateExp) { | ||||
|               this.router.navigate(['account/signin']); | ||||
|               return false; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return true; | ||||
|       } else { | ||||
|         this.router.navigate(['account/signin']); | ||||
|         return false; | ||||
|       } | ||||
|   } | ||||
|    | ||||
| } | ||||
|  | @ -0,0 +1 @@ | |||
| <p>page-account works!</p> | ||||
|  | @ -0,0 +1,25 @@ | |||
| import { ComponentFixture, TestBed } from '@angular/core/testing'; | ||||
| 
 | ||||
| import { PageAccountComponent } from './page-account.component'; | ||||
| 
 | ||||
| describe('PageAccountComponent', () => { | ||||
|   let component: PageAccountComponent; | ||||
|   let fixture: ComponentFixture<PageAccountComponent>; | ||||
| 
 | ||||
|   beforeEach(async () => { | ||||
|     await TestBed.configureTestingModule({ | ||||
|       declarations: [ PageAccountComponent ] | ||||
|     }) | ||||
|     .compileComponents(); | ||||
|   }); | ||||
| 
 | ||||
|   beforeEach(() => { | ||||
|     fixture = TestBed.createComponent(PageAccountComponent); | ||||
|     component = fixture.componentInstance; | ||||
|     fixture.detectChanges(); | ||||
|   }); | ||||
| 
 | ||||
|   it('should create', () => { | ||||
|     expect(component).toBeTruthy(); | ||||
|   }); | ||||
| }); | ||||
|  | @ -0,0 +1,15 @@ | |||
| import { Component, OnInit } from '@angular/core'; | ||||
| 
 | ||||
| @Component({ | ||||
|   selector: 'app-page-account', | ||||
|   templateUrl: './page-account.component.html', | ||||
|   styleUrls: ['./page-account.component.scss'] | ||||
| }) | ||||
| export class PageAccountComponent implements OnInit { | ||||
| 
 | ||||
|   constructor() { } | ||||
| 
 | ||||
|   ngOnInit(): void { | ||||
|   } | ||||
| 
 | ||||
| } | ||||
|  | @ -1,7 +1,8 @@ | |||
| import { HttpClient } from '@angular/common/http'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { Observable } from 'rxjs'; | ||||
| import { map, Observable } from 'rxjs'; | ||||
| import { environment } from 'src/environments/environment'; | ||||
| import { any } from 'underscore'; | ||||
| import { User } from '../models/user'; | ||||
| 
 | ||||
| @Injectable({ | ||||
|  | @ -9,9 +10,11 @@ import { User } from '../models/user'; | |||
| }) | ||||
| export class AuthService { | ||||
|   private apiUrl: string; | ||||
|   private tokenKey: string; | ||||
| 
 | ||||
|   constructor(private http: HttpClient) { | ||||
|     this.apiUrl = environment.apiUrl; | ||||
|     this.tokenKey = environment.tokenKey; | ||||
|    } | ||||
| 
 | ||||
|    signup(newUser: User): Observable<any> { | ||||
|  | @ -33,6 +36,13 @@ export class AuthService { | |||
|       password: password | ||||
|     }; | ||||
|      | ||||
|     return this.http.post(`${this.apiUrl}/login`, body); | ||||
|     return this.http.post(`${this.apiUrl}/login`, body).pipe( | ||||
|       map((x: any) => { | ||||
|         console.log('Service : ', x.accessToken); | ||||
|         // Modification à faire ici 
 | ||||
|         localStorage.setItem(this.tokenKey, x.accessToken); | ||||
|         return x; // permet de renvoyer la réponse à l'initiateur (page Signin) après le traitement du map
 | ||||
|        }) | ||||
|     ); | ||||
|    } | ||||
| } | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| export const environment = { | ||||
|   production: true, | ||||
|   apiUrl: "" | ||||
|   apiUrl: "", | ||||
|   tokenKey: "TOKEN-LBP" | ||||
| }; | ||||
|  |  | |||
|  | @ -4,7 +4,8 @@ | |||
| 
 | ||||
| export const environment = { | ||||
|   production: false, | ||||
|   apiUrl: "http://localhost:3000" | ||||
|   apiUrl: "http://localhost:3000", | ||||
|   tokenKey: "TOKEN-LBP" | ||||
| }; | ||||
| 
 | ||||
| /* | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Julian Tomczyk
						Julian Tomczyk