处理响应中的身份验证错误

Handling authentication errors in response

从 Angular 4 应用程序,我正在调用部署在 Tomcat 上的 REST 服务。对于身份验证,我使用的是 Kerberos,它在正常情况下按预期工作。

我在 Angular 中遇到 Kerberos 身份验证失败时处理错误的问题(假设是由于 AD 中不存在的用户)。

这是我的 Angular 代码

this.restService.executeGET(url)
      .subscribe(
      (response: Response) => {
        let httpResponseStatus = response.status;
        console.log('httpResponseStatus: '+httpResponseStatus+', httpResponseAuthHeader: '+httpResponseAuthHeader)
        //Do something with the Response
      }
      ,
      (error) => {
        //Do something with the Error
        console.log('Authenication Failed' + error); 

      }
      )

 executeGET(url: string) {
    let reqHeaders = new Headers({ 'Content-Type': 'application/json' });
    reqHeaders.append('Accept', 'application/json');
    return this.http.get(url, { headers: reqHeaders });  
  }   

当身份验证成功并且服务器返回 200 时,'(response: Response) => {}' 将按预期执行。当响应是带有 WWW-Authenticate 的 401 代码时:协商 header,'response' 块和 'error' 块都不会被执行并且浏览器显示“页面无法显示”留言。

当我查看 IE 11 网络选项卡时,它显示响应已作为 401/Negotiate 返回,但由于某种原因它正在逃避 angular 代码。

似乎浏览器甚至在 Angular 代码有机会加载之前就显示“页面无法显示”消息。

即使身份验证失败,我如何确保执行某些代码块,以便我可以采取适当的操作,例如将用户重定向到登录页面。

只需将此检查添加到服务 http 调用中

import 'rxjs/add/operator/catch';
.catch(e => {
            if (e.status === 401) {
                return Observable.throw('Not authorized');
            }
            // do other stuff
        });

并在组件订阅中

    this.your service.methodname()
        .subscribe(data => {
            // your data
        }, (err) => {
            if (err === 'Not Authorized') { 
// Do your stuff here
        });

如果您想要一个全局 401 处理程序用于您的应用程序服务,您可以在 Angular

中查看使用 http xhr 的答案