У нас есть приложение на Angular, в котором нам нужно перенаправить пользователя на страницу входа в систему (когда пользователь не аутентифицирован или когда токен истек).
Мы используем HttpInterceptor для обработки 401 HTTPкод состояния (приведенный ниже исходный код был, конечно, упрощен, чтобы сделать его понятнее)
@Injectable()
export class AppHttpInterceptor implements HttpInterceptor {
constructor(private router: Router, private inj: Injector, @Inject(DOCUMENT) private document: any) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const headers = new HttpHeaders({
'X-Requested-With': 'XMLHttpRequest',
});
const changedReq = req.clone({ headers, withCredentials: true });
return next.handle(changedReq)
.map((event: HttpEvent<any>) => {
return event;
})
.do(event => {
})
.catch((err: any, caught) => {
if (err instanceof HttpErrorResponse) {
switch (err.status) {
case 401:
this.document.location.href = <external-url>
return Observable.throw(err);
default:
return Observable.throw(err);
}
} else {
return Observable.throw(err);
}
});
});
}
}
Все работает нормально, когда приложение запускается из браузера с URL-адресом, таким как https://localhost:4200
Но теперь нам нужно включить наше приложение в iframe (мы не будем владельцем родительского контейнера).
Чтобы протестировать наше приложение внутри iframe, у нас есть следующий HTML
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>My Fake Portal</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<h1>My Fake Portal</h1>
<br/>
<br/>
<iframe width="100%" src="https://localhost:4200"></iframe>
</body>
</html>
Интеграция работает, но когда HttpInterceptor пытается достичь страницы входа с помощью this.document.location.href
, он перенаправляетбраузер вместо перенаправления iframe (а затем уничтожения родительского контейнера).
this.document
должен быть текущим документом, а не верхним документом DOM.
У кого-нибудь есть идея?