So habe ich eine einfache eckige 2/Laravel App mit JWT Authentifizierung Unterstützung. Ich habe einen Dienst, der jedes Mal, wenn eine Route aufgerufen wird, verifiziert, wenn das JWT-Token gültig ist oder nicht die Funktion angular2-jwt tokenNotExpired() verwendet, aber diese Funktion gibt aus einem bestimmten Grund immer false zurück, sodass der Benutzer immer zur Anmeldeseite weitergeleitet wird.angular2-jwt Token always nicht gültig
Es ist also so, dass sich der Benutzer anmeldet, ein Token wird vom Backend generiert und im lokalen Speicher gespeichert, dann prüft ein Dienst vor dem Initiieren einer Route mithilfe des CanActivate-Lebenszyklus-Hooks, ob das Token gültig ist. Hier
ist, was ich bisher getan:
Anmeldung Komponente:
...
this.http.post(SERVER_URL + 'auth', body, {
headers: headers
}
).subscribe(
data => {
localStorage.setItem('auth_token', data.json().token);
this.authHttp.get(SERVER_URL + 'auth/user', headers)
.subscribe(
data => {
this.store.dispatch({ type: SET_CURRENT_USER_PROFILE, payload: data.json().user });
localStorage.setItem('user', data.json().user);
this.router.navigate(['/home']);
},
err => console.log('Fehlermeldung: ' + err)
);
},
...
app.module:
...
{ provide: AuthConfig, useValue: new AuthConfig({
headerName: 'Authorization',
headerPrefix: 'Bearer ',
tokenName: 'auth_token',
tokenGetter: (() => localStorage.getItem('auth_token')),
globalHeaders: [{ 'Content-Type': 'application/json' }],
noJwtError: true,
noTokenScheme: true
})},
AuthHttp
...
auth.service: // Check JWT Token Service
import { tokenNotExpired } from 'angular2-jwt';
import { Injectable } from '@angular/core';
@Injectable()
export class AuthService {
loggedIn() {
return tokenNotExpired();
}
}
auth.guard.service:
// Check if the Token of the user is still valid
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
import { AppState } from '../shared/interfaces';
import { SET_CURRENT_USER_PROFILE } from '../shared/state.actions';
import { Store } from '@ngrx/store'
@Injectable()
export class AuthGuardService implements CanActivate {
constructor(private auth: AuthService, private router: Router, private store: Store<AppState>) {}
canActivate() {
if(this.auth.loggedIn()) {
return true;
} else {
console.log ('Token expired or not valid')
localStorage.setItem('auth_token', '');
localStorage.setItem('user', '');
this.store.dispatch({ type: SET_CURRENT_USER_PROFILE, payload: null });
this.router.navigate(['/']);
return false;
}
}
}
app.routing:
const routes: Routes = [
{ path: 'home', component: HomeComponent},
{ path: 'about', component: AboutComponent, canActivate: [AuthGuardService]},
{ path: 'profile/:id', component: ProfileComponent, canActivate: [AuthGuardService]},
{ path: '', component: LoginComponent}
];
EDIT: Von der Backend-Seite alles ist in der Regel in Ordnung, da die Token in der localstorage nachdem sich der Benutzer generiert und gespeichert in
Es wäre hilfreich, zu erklären, warum das funktioniert, und wie die OP es für sich selbst hätte herausgefunden. – dcorking