Refonte du stockage des données utilisateur en sessionStorage et non avec des cookies
This commit is contained in:
		
							parent
							
								
									3644414873
								
							
						
					
					
						commit
						3c4053ffcc
					
				| @ -30,12 +30,7 @@ | ||||
|             "styles": [ | ||||
|               "src/styles.css" | ||||
|             ], | ||||
|             "scripts": [], | ||||
|             "server": "src/main.server.ts", | ||||
|             "prerender": true, | ||||
|             "ssr": { | ||||
|               "entry": "server.ts" | ||||
|             } | ||||
|             "scripts": [] | ||||
|           }, | ||||
|           "configurations": { | ||||
|             "production": { | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { CookieService } from 'ngx-cookie-service'; | ||||
| import { Author } from './models/author'; | ||||
| import { BehaviorSubject } from 'rxjs'; | ||||
| import {Injectable} from '@angular/core'; | ||||
| import {CookieService} from 'ngx-cookie-service'; | ||||
| import {Author} from './models/author'; | ||||
| import {BehaviorSubject} from 'rxjs'; | ||||
| import {DateTime} from 'luxon'; | ||||
| 
 | ||||
| @Injectable({ | ||||
| @ -16,28 +16,33 @@ export class AuthService { | ||||
|   } | ||||
| 
 | ||||
|   isAuthenticated(): boolean { | ||||
|     return this.cookieService.check("author") && | ||||
|       this.cookieService.check("token") && | ||||
|       this.cookieService.check("token-expiration-date") && | ||||
|       this.cookieService.get("author") !== '' && | ||||
|       this.cookieService.get("token-expiration-date") !== '' && | ||||
|       this.cookieService.get("token") !== ''; | ||||
|     return sessionStorage.getItem("author") !== null && | ||||
|       sessionStorage.getItem("token") !== null && | ||||
|       sessionStorage.getItem("token-expiration-date") !== null; | ||||
|   } | ||||
| 
 | ||||
|   getTokenExpirationDate(): DateTime { | ||||
|     return DateTime.fromISO(this.cookieService.get("token-expiration-date")); | ||||
|   getTokenExpirationDate(): string | null { | ||||
|     return sessionStorage.getItem("token-expiration-date"); | ||||
|   } | ||||
| 
 | ||||
|   isSessionExpired(): boolean { | ||||
|     return this.getTokenExpirationDate() < DateTime.now() && this.isAuthenticated(); | ||||
|     const tokenExpirationDate = this.getTokenExpirationDate(); | ||||
|     if (tokenExpirationDate) { | ||||
|       return DateTime.fromISO(tokenExpirationDate) < DateTime.now() && this.isAuthenticated(); | ||||
|     } | ||||
|     return true | ||||
|   } | ||||
| 
 | ||||
|   getAuthenticatedAuthor(): Author { | ||||
|     return JSON.parse(this.cookieService.get('author')); | ||||
|   getAuthenticatedAuthor(): Author | null { | ||||
|     const authorStr = sessionStorage.getItem('author') | ||||
|     if (authorStr) { | ||||
|       return JSON.parse(authorStr); | ||||
|     } | ||||
|     return null; | ||||
|   } | ||||
| 
 | ||||
|   getAuthenticatedAuthorToken(): string { | ||||
|     return this.cookieService.get('token'); | ||||
|   getAuthenticatedAuthorToken(): string | null{ | ||||
|     return sessionStorage.getItem('token'); | ||||
|   } | ||||
| 
 | ||||
|   setSessionExpired(expired: boolean) { | ||||
|  | ||||
| @ -36,8 +36,8 @@ export class CommentFormComponent { | ||||
|   } | ||||
| 
 | ||||
|   onSubmit() { | ||||
|     let token: string = this.authService.getAuthenticatedAuthorToken(); | ||||
|     let author: Author = this.authService.getAuthenticatedAuthor(); | ||||
|     let token = this.authService.getAuthenticatedAuthorToken(); | ||||
|     let author = this.authService.getAuthenticatedAuthor(); | ||||
|     if (this.commentForm.valid && author && token && this.commentForm.value.content) { | ||||
|       // get l'image de profile après avoir créé le commentaire
 | ||||
|       this.subs.push(this.commentService.create(this.commentForm.value.content, this.postId, author.id, token).subscribe({ | ||||
|  | ||||
| @ -25,8 +25,9 @@ export class HeaderComponent { | ||||
|   } | ||||
| 
 | ||||
|   private initializeMenu(): void { | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated()) { | ||||
|       this.actualAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|     const authenticatedAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated() && authenticatedAuthor) { | ||||
|       this.actualAuthor = authenticatedAuthor; | ||||
|     } | ||||
| 
 | ||||
|     if (this.actualAuthor) { | ||||
|  | ||||
| @ -105,9 +105,9 @@ export class PostFormComponent implements OnDestroy { | ||||
| 
 | ||||
|       if (this.isUpdateMode && this.postId) { | ||||
|         this.subs.push( | ||||
|           this.postService.updatePost(this.postId, postData, this.authService.getAuthenticatedAuthorToken()).pipe( | ||||
|           this.postService.updatePost(this.postId, postData, this.authService.getAuthenticatedAuthorToken()!).pipe( | ||||
|             mergeMap((_) => { | ||||
|               return this.postService.changeIllustration(this.postId, this.uploadedFile, this.authService.getAuthenticatedAuthorToken()); | ||||
|               return this.postService.changeIllustration(this.postId, this.uploadedFile, this.authService.getAuthenticatedAuthorToken()!); | ||||
|             }) | ||||
|           ).subscribe({ | ||||
|             next: (_) => { | ||||
| @ -118,11 +118,11 @@ export class PostFormComponent implements OnDestroy { | ||||
|         ); | ||||
|       } else { | ||||
|         this.subs.push( | ||||
|           this.postService.createPost(postData, this.authService.getAuthenticatedAuthorToken()).pipe( | ||||
|           this.postService.createPost(postData, this.authService.getAuthenticatedAuthorToken()!).pipe( | ||||
|             mergeMap(post => | ||||
|               this.authorService.attributePost(this.actualAuthor?.id, post.id, this.authService.getAuthenticatedAuthorToken()).pipe( | ||||
|               this.authorService.attributePost(this.actualAuthor?.id, post.id, this.authService.getAuthenticatedAuthorToken()!).pipe( | ||||
|                 mergeMap((_) => | ||||
|                   this.postService.changeIllustration(post.id, this.uploadedFile, this.authService.getAuthenticatedAuthorToken()), | ||||
|                   this.postService.changeIllustration(post.id, this.uploadedFile, this.authService.getAuthenticatedAuthorToken()!), | ||||
|                 ) | ||||
|               ) | ||||
|             ) | ||||
|  | ||||
| @ -37,7 +37,7 @@ export class RegisterFormComponent implements OnDestroy { | ||||
|   ]; | ||||
|   subs: Subscription[] = []; | ||||
|   form: FormGroup; | ||||
|   actualAuthor: Author | undefined; | ||||
|   actualAuthor: string | undefined; | ||||
| 
 | ||||
|   constructor(private formBuilder: FormBuilder, | ||||
|               private authorService: AuthorService, | ||||
| @ -45,8 +45,9 @@ export class RegisterFormComponent implements OnDestroy { | ||||
|               private messageService: MessageService, | ||||
|               private authService: AuthService, | ||||
|   ) { | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated()) { | ||||
|       this.actualAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|     const authenticatedAuthor = this.authService.getAuthenticatedAuthorToken(); | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated() && authenticatedAuthor) { | ||||
|       this.actualAuthor = authenticatedAuthor; | ||||
|     } | ||||
|     this.form = this.formBuilder.group({ | ||||
|       username: ['', [Validators.required, Validators.maxLength(255)]], | ||||
| @ -83,7 +84,7 @@ export class RegisterFormComponent implements OnDestroy { | ||||
|           this.username, | ||||
|           this.password, | ||||
|           this.role, | ||||
|           this.authService.getAuthenticatedAuthorToken()).subscribe({ | ||||
|           this.authService.getAuthenticatedAuthorToken()!).subscribe({ | ||||
|           next: (author: Author) => { | ||||
|             this.successMessage('Succès', `Auteur ${author.name} créé avec succès`); | ||||
|             this.createdAuthor.emit(author); | ||||
|  | ||||
| @ -80,7 +80,7 @@ export class UpdateProfileFormComponent implements OnDestroy { | ||||
|   } | ||||
| 
 | ||||
|   onSubmit() { | ||||
|     const token: string = this.authService.getAuthenticatedAuthorToken(); | ||||
|     const token = this.authService.getAuthenticatedAuthorToken(); | ||||
|     if (this.form.valid && token && this.password === this.passwordConfirm) { | ||||
|       const newUsername = this.form.value.username; | ||||
|       if (this.uploadedFile) { | ||||
|  | ||||
| @ -1,17 +1,18 @@ | ||||
| import {CanActivateFn, Router} from '@angular/router'; | ||||
| import {inject} from '@angular/core'; | ||||
| import {CookieService} from 'ngx-cookie-service'; | ||||
| import {AuthService} from '../auth.service'; | ||||
| import {Role} from '../models/role'; | ||||
| 
 | ||||
| export const writerGuard: CanActivateFn = (route, state) => { | ||||
|   const router = inject(Router); | ||||
|   const cookieService = inject(CookieService); | ||||
|   const authService = inject(AuthService); | ||||
|   const authorStr = sessionStorage.getItem("author"); | ||||
| 
 | ||||
|   if ((authService.isAuthenticated() && JSON.parse(cookieService.get("author")).role !== Role.WRITER) || !authService.isAuthenticated()) { | ||||
|   if (authorStr) { | ||||
|     if ((authService.isAuthenticated() && JSON.parse(authorStr).role !== Role.WRITER) || !authService.isAuthenticated()) { | ||||
|       router.navigate(['/']); | ||||
|     } | ||||
| 
 | ||||
|     return true; | ||||
|   } | ||||
|   return false; | ||||
| }; | ||||
|  | ||||
| @ -29,9 +29,9 @@ export class HomeComponent implements OnDestroy { | ||||
|   constructor( | ||||
|     private postService: PostService, | ||||
|     private authService: AuthService) { | ||||
| 
 | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated()) { | ||||
|       this.actualAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|     const authenticatedAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated() && authenticatedAuthor) { | ||||
|       this.actualAuthor = authenticatedAuthor; | ||||
|     } else { | ||||
|       this.authService.checkSessionExpiration(); | ||||
|     } | ||||
|  | ||||
| @ -35,9 +35,9 @@ export class LoginComponent implements OnDestroy { | ||||
| 
 | ||||
|   constructor(private authorService: AuthorService, | ||||
|               private messageService: MessageService, | ||||
|               private cookieService: CookieService, | ||||
|               private router: Router, | ||||
|               private configurationService: ConfigurationService,) {} | ||||
|               private configurationService: ConfigurationService,) { | ||||
|   } | ||||
| 
 | ||||
|   sendLogins(): void { | ||||
|     if (this.password === this.confirmPassword) { | ||||
| @ -45,26 +45,15 @@ export class LoginComponent implements OnDestroy { | ||||
|       ( | ||||
|         this.authorService.login(this.name, this.password).pipe( | ||||
|           switchMap((tokenObj: any) => { | ||||
|             this.cookieService.delete('token', '/', this.configurationService.getDomain()) | ||||
|             this.cookieService.set("token", tokenObj.token, { | ||||
|               domain: this.configurationService.getDomain(), | ||||
|               secure: true, | ||||
|               path: '/' | ||||
|             }); | ||||
|             // sessionStorage.removeItem('token');
 | ||||
|             sessionStorage.setItem('token', tokenObj.token); | ||||
|             return this.authorService.me(tokenObj.token) | ||||
|           })) | ||||
|           .subscribe({ | ||||
|             next: (author: Author) => { | ||||
|               this.cookieService.delete('author', '/', this.configurationService.getDomain()) | ||||
|               this.cookieService.set("author", JSON.stringify(author), { | ||||
|                 domain: this.configurationService.getDomain(), | ||||
|                 secure : true, | ||||
|                 path: '/' }); | ||||
|               this.cookieService.set('token-expiration-date', DateTime.now().plus({millisecond: this.configurationService.getTokenTTL()}).toISO(), { | ||||
|                 domain: this.configurationService.getDomain(), | ||||
|                 secure: true, | ||||
|                 path: '/', | ||||
|               }) | ||||
|               // sessionStorage.removeItem('author');
 | ||||
|               sessionStorage.setItem('author', JSON.stringify(author)); | ||||
|               sessionStorage.setItem('token-expiration-date', DateTime.now().plus({millisecond: this.configurationService.getTokenTTL()}).toISO()) | ||||
|               this.getAuthorCookie(); | ||||
|               this.router.navigate(['/']).then(() => { | ||||
|                 this.successMessage('Connecté avec succès', 'Heureux de vous revoir ' + this.actualAuthor?.name) | ||||
| @ -79,7 +68,10 @@ export class LoginComponent implements OnDestroy { | ||||
|   } | ||||
| 
 | ||||
|   getAuthorCookie(): void { | ||||
|     this.actualAuthor = JSON.parse(this.cookieService.get("author")); | ||||
|     const authorStr = sessionStorage.getItem('author'); | ||||
|     if (authorStr) { | ||||
|       this.actualAuthor = JSON.parse(authorStr); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   successMessage(summary: string, detail: string): void { | ||||
|  | ||||
| @ -37,14 +37,17 @@ export class MyPostsComponent implements OnDestroy { | ||||
|   updateDialogVisibility: boolean[] = []; | ||||
|   deleteDialogVisibility: boolean[] = []; | ||||
|   posts: Post[] = []; | ||||
|   actualAuthor: Author; | ||||
|   actualAuthor: Author | undefined; | ||||
| 
 | ||||
| 
 | ||||
|   constructor(private authService: AuthService, | ||||
|               private postService: PostService, | ||||
|               private authorService: AuthorService, | ||||
|               private messageService: MessageService) { | ||||
|     this.actualAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|     const authenticatedAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|     if (authenticatedAuthor) { | ||||
|       this.actualAuthor = authenticatedAuthor; | ||||
|     } | ||||
|     this.updatePosts(); | ||||
|   } | ||||
| 
 | ||||
| @ -59,8 +62,9 @@ export class MyPostsComponent implements OnDestroy { | ||||
|   } | ||||
| 
 | ||||
|   updatePosts(): void { | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated()) { | ||||
|       this.authorService.getAuthorsPosts(this.actualAuthor?.id, this.authService.getAuthenticatedAuthorToken()).subscribe({ | ||||
|     const authorToken = this.authService.getAuthenticatedAuthorToken() | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated() && authorToken) { | ||||
|       this.authorService.getAuthorsPosts(this.actualAuthor?.id, authorToken).subscribe({ | ||||
|           next: posts => this.posts = posts, | ||||
|           error: error => this.failureMessage("Erreur", error.error.message), | ||||
|         } | ||||
| @ -71,13 +75,16 @@ export class MyPostsComponent implements OnDestroy { | ||||
|   } | ||||
| 
 | ||||
|   deletePost(id: bigint, rowIndex: number) { | ||||
|     this.postService.deletePost(id, this.authService.getAuthenticatedAuthorToken()).subscribe({ | ||||
|     const authorToken = this.authService.getAuthenticatedAuthorToken() | ||||
|     if (authorToken) { | ||||
|       this.postService.deletePost(id, authorToken).subscribe({ | ||||
|         next: (_) => { | ||||
|           this.updatePosts() | ||||
|           this.successMessage("Post supprimé", "Ce post a été supprimé avec succès") | ||||
|         }, | ||||
|         error: error => this.failureMessage("Erreur", error.error.message), | ||||
|       }); | ||||
|     } | ||||
|     this.closeDialog(this.deleteDialogVisibility, rowIndex) | ||||
|   } | ||||
| 
 | ||||
|  | ||||
| @ -40,7 +40,7 @@ export class NewPostComponent implements OnDestroy { | ||||
|               private postService: PostService, | ||||
|               private authorService: AuthorService, | ||||
|               private messageService: MessageService, | ||||
|               private authService : AuthService, | ||||
|               private authService: AuthService, | ||||
|               private router: Router) { | ||||
|     this.form = this.formBuilder.group({ | ||||
|       description: ['', [Validators.required, Validators.maxLength(512)]], | ||||
| @ -49,7 +49,10 @@ export class NewPostComponent implements OnDestroy { | ||||
|       category: ['', [Validators.required, Validators.maxLength(50)]], | ||||
|     }); | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated()) { | ||||
|       this.actualAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|       const authenticatedAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|       if (authenticatedAuthor) { | ||||
|         this.actualAuthor = authenticatedAuthor; | ||||
|       } | ||||
|     } else { | ||||
|       this.authService.checkSessionExpiration(); | ||||
|     } | ||||
| @ -72,12 +75,14 @@ export class NewPostComponent implements OnDestroy { | ||||
|         category: formData.category as string | ||||
|       }; | ||||
| 
 | ||||
|       const authenticatedAuthor = this.authService.getAuthenticatedAuthorToken(); | ||||
|       if (authenticatedAuthor) { | ||||
|         this.subs.push( | ||||
|         this.postService.createPost(postToPost, this.authService.getAuthenticatedAuthorToken()).pipe( | ||||
|           this.postService.createPost(postToPost, authenticatedAuthor).pipe( | ||||
|             mergeMap(post => | ||||
|             this.authorService.attributePost(this.actualAuthor?.id, post.id, this.authService.getAuthenticatedAuthorToken()).pipe( | ||||
|               this.authorService.attributePost(this.actualAuthor?.id, post.id, authenticatedAuthor).pipe( | ||||
|                 mergeMap((_) => | ||||
|                 this.postService.changeIllustration(post.id, this.uploadedFile, this.authService.getAuthenticatedAuthorToken()), | ||||
|                   this.postService.changeIllustration(post.id, this.uploadedFile, authenticatedAuthor), | ||||
|                 ) | ||||
|               ) | ||||
|             ) | ||||
| @ -92,6 +97,9 @@ export class NewPostComponent implements OnDestroy { | ||||
|             } | ||||
|           }) | ||||
|         ); | ||||
|       } else { | ||||
|         console.error("Profil mal chargé") | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  | ||||
| @ -49,7 +49,12 @@ export class PostComponent { | ||||
|               private authService: AuthService,) { | ||||
|     this.route.paramMap.subscribe(params => { | ||||
|       if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated()) { | ||||
|         this.actualAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|         const authenticatedAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|         if (authenticatedAuthor) { | ||||
|           this.actualAuthor = authenticatedAuthor; | ||||
|         } else { | ||||
|           console.error('Profil mal chargé'); | ||||
|         } | ||||
|       } else { | ||||
|         this.authService.checkSessionExpiration(); | ||||
|       } | ||||
|  | ||||
| @ -43,7 +43,12 @@ export class ProfileComponent implements OnDestroy { | ||||
|       })); | ||||
|     }) | ||||
|     if (!(this.authService.isSessionExpired()) && this.authService.isAuthenticated()) { | ||||
|       this.actualAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|       const authenticatedAuthor = this.authService.getAuthenticatedAuthor(); | ||||
|       if (authenticatedAuthor) { | ||||
|         this.actualAuthor = authenticatedAuthor; | ||||
|       } else { | ||||
|         console.error("Profil mal chargé"); | ||||
|       } | ||||
|     } else { | ||||
|       this.authService.checkSessionExpiration(); | ||||
|     } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user