Я использую охрану активации и сервер Node с JWT. Маршрутизация при нормальной работе работает хорошо. Однако, когда срок действия токена истек, а страница все еще существует в браузере, я могу щелкнуть в приложении angular, хотя данных API не существует. Я просмотрел свою настройку несколько раз, и она выглядит правильно, но по какой-то причине она не перенаправляет для входа в систему, когда токен не существует или истек.
----- АВТОМОБИЛЬНАЯ СЛУЖБА
import { Injectable } from "@angular/core";
import { CanActivate } from "@angular/router";
import { AuthService } from "../auth/auth.service";
import { UserService } from "../user.service";
@Injectable({ providedIn: "root" })
export class AuthGuardService implements CanActivate {
constructor(public userService: UserService, public auth: AuthService) {}
canActivate(): boolean {
if (!this.auth.isAuthenticated()) {
this.userService.logout();
return false;
}
return true;
}
}
----- АВТОМАТИЧЕСКОЕ ОБСЛУЖИВАНИЕ
import { Injectable } from "@angular/core";
import * as jwt_decode from "jwt-decode";
import { UserService } from "../user.service";
import { Router } from "@angular/router";
@Injectable({ providedIn: "root" })
export class AuthService {
constructor(public userService: UserService, private _router: Router) {}
///// Method to check if user is authenticated (normal employees / non-admin)
public isAuthenticated(): boolean {
// Get token from localstorage
const token = localStorage.getItem("token");
// Check to see if token exists, if not return false
if (!token) {
return false;
}
// Decode token and get expiration date
const decoded = jwt_decode(token);
const date = decoded.exp;
// check if expiration is less than current time, if so return true
if (date < Date.now()) {
this.userService.setCurrentUser(decoded);
return true;
} else {
return false;
}
}
}
----- ОСНОВНОЙ МАРШРУТ
{
path: "projects",
component: ProjectsComponent,
canActivate: [AuthGuardService]
},
----- СПОСОБ ВЫХОДА ИЗ СЛУЖБЫ ПОЛЬЗОВАТЕЛЯ
// Logout (used in navbar and by auth service)
logout() {
localStorage.removeItem(this.TOKEN_KEY);
this.removeCurrentUser();
this._router.navigate(["login"]);
}
Все кажется правильным. Пользователь получает токен из API, переходит в локальное хранилище. На каждом маршруте читается токен и проверяется дата, если еще не истек срок действия, возвращается истина, маршрут хороший. Если срок действия токена истек, я вызываю службу пользователя и метод выхода из системы. Этот метод уничтожает токен, удаляет свойство currentUser и переводит пользователя на страницу входа. Это перенаправление страницы входа не происходит.
Если я вернусь на страницу по прошествии времени и срок действия токена истечет, я не смогу перемещаться между страницами angular, но по какой-то причине я
Любая помощь приветствуется, спасибо!
/
перед входом в систему:this._router.navigate(["/login"]);
- person ferhado   schedule 17.01.2020localStorage
должным образом. После выхода из системы вAuthService
вставьтеdebugger
илиconsole.log
внутрьif (!token)
и убедитесь, что он отключился. Кроме того, вAuthGuardService
поместитеconsole.log
илиdebugger
вif(!this.auth.isAuthenticated())
и убедитесь, что он также срабатывает, когда вы не вошли в систему и не перемещаетесь по страницам. - person AliF50   schedule 17.01.2020