使用Angular 5+拦截器阻止HTTP Basic Auth对话框

时间:2018-06-22 19:34:38

标签: angular http-headers

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对话框就足够了,因为我们可以轻松处理重定向,但考虑重定向的解决方案也很好。

0 个答案:

没有答案