Je traite avec HttpClient dans Angular 5, le problème est le cookie envoyé par le serveur pendant le processus de connexion, il semble que Angular l'ignore car ensuite La requête avec "withCredentials" ne la définit pas.
Mon package.json
.... "@ angular/cli": "1.6.3", "@ angular/compiler-cli": "^ 5.0.0", "@ angular/language-service": "^ 5.0.0",. ...
mon code
makeLogin (us:string, password:string): Observable<any> {
let body : any = new HttpParams()
.set('username', us)
.set('password', password);
return this.http.post(this.urlLogin,
body.toString(),
{
headers: new HttpHeaders()
.set('Content-Type', 'application/x-www-form-urlencoded')
}
);
}
Le serveur renvoie http 200 avec ces en-têtes
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:4200
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Length:17
Date:Tue, 23 Jan 2018 21:05:46 GMT
Expires:0
Pragma:no-cache
Set-Cookie:JSESSIONID=BF9392ED5DE99710B44845201DD26B3F;path=/;HttpOnly
Vary:Origin
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block
Après cela, la prochaine demande par exemple
getEventt (): Observable<any> {
return this.http.get('http://localhost:8080/list',{ withCredentials: true });
}
En utilisant chrome ou les outils de développement Firefox, je ne vois pas le cookie envoyé, mais si j'utilise un navigateur ou un facteur, tout fonctionne bien et je peux voir le cookie envoyé.
Je ne sais pas si je fais quelque chose de mal ou si j'utilise mal httpClient.
Si cela aide, le serveur est déployé sur Tomcat 8 et Angular s'exécute sur nodejs (démarrage npm)
Enfin j'ai pu le faire fonctionner !!
La solution était en post-demande,
Peut-être que je me trompe, mais il semble que la classe RequestOptions a été dépréciée dans Angular 5.0.0, donc après plusieurs tentatives dans la bonne configuration, voici la méthode corrigée
/** POST: add a new hero to the server */
makeLogin (us:string, password:string): Observable<any> {
let enco : any = new HttpHeaders()
.set('Content-Type', 'application/x-www-form-urlencoded');
let body : any = new HttpParams()
.set('username', us)
.set('password', password);
return this.http.post(this.urlServicioLogin,
body.toString(),
{
headers: enco,withCredentials:true
}
);
}
Maintenant, avec withCredentials true, je peux voir dans les navigateurs que le cookie est défini, puis l'envoyer avec les demandes suivantes.
Remarque: Si l'application doit consommer un service de repos où l'authentification est effectuée avec des cookies, TOUTES les interactions avec le back-end auront besoin que l'indicateurCredentials soit défini sur true.