2017-08-11 1 views
0

À partir d'une application Angular 4, j'appelle les services REST déployés sur Tomcat. Pour l'authentification, j'utilise Kerberos et il fonctionne comme prévu pour les cas positifs.Traitement des erreurs d'authentification en réponse

Je suis confronté à un problème dans la gestion des erreurs dans Angular lorsque l'authentification Kerberos échoue (disons parce que l'utilisateur n'existe pas dans AD).

Voici mon code angulaire

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 }); 
    } 

Lorsque l'authentification réussit et 200 est renvoyé par le serveur, '(réponse: réponse) => {}' est exécuté comme prévu. Lorsque la réponse est 401 code avec WWW-Authenticate: Negotiate header, ni le bloc 'response' ni le bloc 'error' ne sont exécutés et le navigateur affiche un message 'La page ne peut être affichée'. Lorsque je regarde l'onglet IE 11 Network, cela montre que la réponse a été renvoyée comme 401/Négocier, mais pour une raison quelconque, elle échappe au code angulaire.

Response Header 1

Response Header 2

Il semble que le navigateur affiche la page ne peut pas être affiché 'un message avant même le code Angulaire avoir une chance de charger.

Comment puis-je m'assurer qu'un bloc de code est exécuté même si l'authentification échoue, afin que je puisse prendre les mesures appropriées comme rediriger l'utilisateur vers la page de connexion.

+0

ajouter un service pour gérer une erreur comme '401' comme https://stackoverflow.com/questions/44108285/angular-4-custom-errorhandler-doesnt-r ecognize-custom-error –

Répondre

0

il suffit d'ajouter ce chèque au service http appel

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

Et dans la composante Abonnez-vous

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

Et si vous voulez un gestionnaire global 401 pour votre service d'application, vous pouvez vérifier cette réponse que utilise http xhr en Angulaire Interceptor