Если пользователь не авторизован, его следует перенаправить на страницу входа.Я пробовал код, как показано ниже.Используя этот код, я получаю сообщение об ошибке:
core.js: 1673 ОШИБКА Ошибка: Uncaught (в обещании): InvalidCharacterError: Не удалось выполнить «atob» в «Window»: строка для декодированияне правильно закодирован.
Я не уверен, где проверить эту ошибку.
Кто-нибудь может мне помочь, где я должен внести изменения?
token.service.ts
export class TokenService {
private iss = {
login: 'http://localhost:8000/api/login',
signup: 'http://localhost:8000/api/signup'
}
constructor() { }
setToken(token) {
localStorage.setItem('token', token);
}
getToken() {
return localStorage.getItem('token');
}
isValid() {
const token = this.getToken();
if (token) {
const payload = this.payload(token);
if (payload) {
return Object.values(this.iss).indexOf(payload.iss) > -1 ? true : false;
}
}
return false;
}
payload(token) {
const payload = token.split('.')[1];
return JSON.parse(atob(payload));
}
loggedIn() {
// !! this will return either true or false
return this.isValid();
}
}
auth.guard.ts
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { TokenService } from 'src/app/services/token.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private _tokenService: TokenService, private _router: Router) { }
canActivate(): boolean {
if (this._tokenService.loggedIn()) {
return true;
} else {
this._router.navigate(['login']);
return false;
}
}
}
token-interceptor.service.ts
import { Injectable, Injector } from '@angular/core';
import { HttpInterceptor } from '@angular/common/http';
import { TokenService } from './token.service';
@Injectable({
providedIn: 'root'
})
export class TokenInterceptorService implements HttpInterceptor {
constructor(private injector: Injector) { }
intercept(req, next) {
let authService = this.injector.get(TokenService);
let tokenizedReq = req.clone({
setHeaders: {
Authorization: 'Bearer ' + authService.getToken()
}
});
return next.handle(tokenizedReq);
}
}
app-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { SpecialEventsComponent } from './components/special-events/special-events.component';
import { AuthGuard } from './guards/auth.guard';
const routes: Routes = [
{
path: 'special',
component: SpecialEventsComponent,
canActivate: [AuthGuard]
},
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }