added correct logout to frontend

This commit is contained in:
u80864958
2025-04-30 17:07:37 +02:00
parent eed1718a7e
commit 8d30e53a91
3 changed files with 20 additions and 4 deletions

View File

@ -5,7 +5,7 @@
<h1 class="text-2xl">My Blog</h1>
</a>
<nav class="flex gap-5">
<a routerLink="/admin" *ngIf="loggedIn()">admin</a>
<a routerLink="/dashboard" *ngIf="loggedIn()">admin</a>
<button *ngIf="!loggedIn()" (click)="toggleLogin()">login</button>
<button *ngIf="loggedIn()" (click)="logOut()">logout</button>
</nav>

View File

@ -27,6 +27,6 @@ export class AppComponent {
this.loginOpen = !this.loginOpen;
}
logOut() {
this.auth.jwt.set(null);
this.auth.logout();
}
}

View File

@ -6,7 +6,7 @@ import {
signal,
WritableSignal,
} from '@angular/core';
import { LoginResponse, User, Token } from '../interfaces/auth';
import { LoginResponse, User, Claims } from '../interfaces/auth';
import { environment } from '../../../environments/environment';
const JWT_KEY = 'token';
@ -17,6 +17,7 @@ const JWT_KEY = 'token';
export class AuthService {
private http = inject(HttpClient);
jwt: WritableSignal<string | null> = signal(null);
claims: WritableSignal<Claims | null> = signal(null);
timeout: any | null = null;
constructor() {
@ -26,6 +27,16 @@ export class AuthService {
this.jwt.set(token);
}
// update claims
effect(() => {
const token = this.jwt();
if (!token) {
this.claims.set(null);
return;
}
this.claims.set(parseJwt(token));
});
// set localStorage when this.jwt changes
effect(() => {
const token = this.jwt();
@ -65,6 +76,11 @@ export class AuthService {
.post<LoginResponse>(`${environment.apiRoot}/login`, user)
.subscribe((res) => this.jwt.set(res.token));
}
logout() {
this.http.delete(`${environment.apiRoot}/logout`).subscribe(() => {
this.jwt.set(null);
});
}
private clearTimeout() {
if (this.timeout) {
@ -75,7 +91,7 @@ export class AuthService {
}
// https://stackoverflow.com/questions/38552003/how-to-decode-jwt-token-in-javascript-without-using-a-library
function parseJwt(token: string): Token {
function parseJwt(token: string): Claims {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(