与this question类似的情况,我有一个使用基本身份验证的Angular 5应用程序,并且当身份验证票证无效/不再有效(通过超时或其他方式)时,我将获得浏览器的基本身份验证对话。该应用程序使用拦截器向每个请求添加身份验证详细信息,但是401处理是在浏览器对话框之后发生的,这使得现在做我想做的一切为时已晚,每当您收到401到登录页面时便进行重定向。
@Injectable()
export class TokenInterceptorService implements HttpInterceptor {
constructor(private injector: Injector) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(request.url.startsWith("/my/service/") || request.url.startsWith("/my/api/")){
const authService = this.injector.get(AuthenticationService);
if(authService.isLoggedIn()){
request = request.clone({
setHeaders: {
Authorization: authService.getTicketEcmBase64()
}
});
}
}
const router = this.injector.get(Router);
const url = router.url;
return next.handle(request).do(() => {}, error => {
if (error instanceof HttpErrorResponse && (error.status == 401 || error.status == 403)) {
// By this point the browser already did its thing so it's too late...
// Other handling stuff here...
...
// Finally, a redirect to login
if (!url.endsWith('login')){
router.navigate(['/login']);
}
}
});
}
}
我使用的是Authentication Guard进行导航,因此该导航部分在很多情况下将不适用。在某些情况下,呼叫不是导航而是xhr,例如实时搜索,但我仍然不想得到该对话框。现在要保持标准合规性并支持使用REST客户端的用户(他们将适当地处理该问题),我们绝对不能从401更改状态代码或从Basic更改WWW-Authentication响应标头,否则我们将失去与非浏览器用户。我正在寻找一种解决方案,可以为浏览器解决此问题(因为实际上这是浏览器引起的问题),并且如果解决方案是针对角度的,则更好。
只需禁用auth对话框就足够了,因为我们可以轻松处理重定向,但考虑重定向的解决方案也很好。