Я использую Angular 6 и создаю сервис для защиты некоторых маршрутов в соответствии с ответом узла и датой истечения срока действия токена.
Итак, в моей рабочей службе, которая проверяет токены с истекшим сроком действия, я добавляю следующую функциональность, которая также проверяет ответ сервера.
import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class AuthGuard implements CanActivate {
constructor (
private authService:AuthService,
private router:Router,
private http: HttpClient
){}
canActivate(){
if(this.authService.tokenExpired()) {
//added this >>
this.authService.showRes().subscribe((data) =>
{
console.log('URL DDATA',data);
});
//<< added this
this.router.navigate(['/cms/login']);
return false;
} else {
return true;
}
}
}
Сервис auth
, содержащий showRes
, имеет
showRes(){
return this.http.get(this.router.url).pipe(map(res => res.json()));
}
В app.module
я пользуюсь сервисом как таковым {path:'cms/profile',component:ProfileComponent,canActivate:[AuthGuard] }
и если пользователь не вошел в систему, узел отвечает returnres.json({redirect:true});
Служба угловых маршрутов не позволяет мне выбирать профиль, как следует. Но он не получает ответ сервера.
Вместо console.log('URL DDATA',data);
я вижу
<code>GET http://localhost:4200/cms/login 404 (Not Found)
XHR failed loading: GET "http://localhost:4200/cms/login".
ERROR Response {_body: "<!DOCTYPE html>↵<html lang="en">↵<head>↵<meta char…<pre>Cannot GET /cms/login
↵ ↵ ↵ ", status: 404, ok: false, statusText:« Not Found », заголовки: Headers,…}
Я в замешательстве. Как я могу получить ответ от сервера?
Спасибо
EDIT
Вот весь код промежуточного программного обеспечения узла, который проверяет токены и отправляет обратно JSON службе защиты угловых маршрутов
const jwt = require('jsonwebtoken');
const user = require('../db');
const config = require('../db/config');
exports.required = ()=>{
return (req, res,next)=>{
const token = req.get('Authorization');
const key = config.key;
jwt.verify(token, key,function(err, decoded) {
if (err){ return res.json({redirect:true});}
if (decoded){
let dateNow = Math.floor(Date.now() / 1000);
if (dateNow > decoded.exp){ return res.json({redirect:true});}
next();
}
else { return res.json({redirect:true});}
});
}
}
Я использую промежуточное программное обеспечение как таковое
router.get('/', validate.required(), (req, res)=>{...
РЕДАКТИРОВАТЬ 2
Я добавил простые 'Content-Type','application/json'
заголовки в функцию showRes
. Нет прогресса.
Также странно то, что когда я щелкаю по защищенному маршруту, он перенаправляет меня обратно на страницу входа в систему, как и должно быть, в строке URL-адреса, которую я вижу http://localhost:4200/cms/login
, страница входа в систему появляется, как и должна, но ошибки о страница входа
<code>GET http://localhost:4200/cms/login 404 (Not Found)
ERROR Response {_body: "<!DOCTYPE html>↵<html lang="en">↵<head>↵<meta char…<pre>Cannot GET /cms/login
↵ ↵ ↵ ", status: 404, ok: false, statusText:« Not Found », заголовки: Headers,…}
Ошибка загрузки XHR: GET "http://localhost:4200/cms/login".