CORS cross-domain avec cookie - Javascript/Node.js - Programmation
MarshPosté le 07-01-2016 à 22:49:40
Hello,
Je rencontre à un problème de CORS avec Firefox/Safari (pas de soucis avec les autres browsers principaux). J'ai besoin de pouvoir faire des requêtes ajax CORS, cross-domain, avec envoi de cookie.
Concrètement :
Situation actuelle : Lorsque je me log sur www.mon-site.com, un POST en ajax est fait sur api.mon-network.net avec l'envoi des identifiants. Ceci me permet d'avoir un cookie valide sur *.mon-network.net ensuite stocké par mon navigateur.
Utilisation actuelle: sur www.mon-site.com/caller_ajax, je fais un appel (jquery) ajax vers api.mon-network.net (avec l'option 'withCredentials'). 1) Une pré-requête de préflight (OPTIONS) est faite, sans envoyer les crédentials (mais c'est pas grave, je me suis débrouillé sur le serveur en face pour que ça passe). 2) La vraie requête GET/POST est faite ensuite, en envoyant les credentials (le fameux cookie valide sur *.mon-network.net )... et ceci fonctionne sous Chrome, Edge, IE11.
Soucis: - Firefox ne l'envoi pas avec les settings par défaut ("cookie tiers refusé", pour que ça fonctionne je dois baisser le settings à "seulement des sites visités", pas terrible comme solution) - Safari n'envoi jamais le cookie, peu importe le settings.
Précision : Le problème ne vient pas de headers CORS mal settés, j'ai passé pas mal de temps dessus, tout est niquel même pour la requête OPTIONS (confirmé avec HTTPIE), que le browser envoit le cookie ou pas avec l'OPTIONS. Et puis le fait que ça fonctionne avec Chrome est plutôt un signe que l'erreur n'est pas là.
J'ai quelques idées de solutions, mais en voyez-vous / connaissez-vous une qui les dépasse ? Une best practice sur le sujet ?
Dans ce que j'ai pensé, il y aurait : - faire un CNAME api.mon-site.com vers api.mon-network.net - garder connaissance côté www.mon-site.com de la sessionID d'*.mon-network.net, et la balancer dans l'url de l'appel ajax (...&PHPSESSID= ... le truc à l'ancienne ) - laisser tomber l'idée de faire l'appel en front (ajax) et la faire en back-end, genre en php (curl/guzzle...) - en ajax les browsers refusent de faire un setRequestHeader('Cookie') mais je pourrais peut-être envoyer un header 'Biscuit' qui lui n'est pas blacklisté, et me demerder en face pour ré-interpreter ça.
Bref, vous voyez pourquoi je cherche la best-practice
Marsh Posté le 07-01-2016 à 22:49:40
Hello,
Je rencontre à un problème de CORS avec Firefox/Safari (pas de soucis avec les autres browsers principaux).
J'ai besoin de pouvoir faire des requêtes ajax CORS, cross-domain, avec envoi de cookie.
Concrètement :
Situation actuelle :
Lorsque je me log sur www.mon-site.com, un POST en ajax est fait sur api.mon-network.net avec l'envoi des identifiants.
Ceci me permet d'avoir un cookie valide sur *.mon-network.net ensuite stocké par mon navigateur.
Utilisation actuelle:
sur www.mon-site.com/caller_ajax, je fais un appel (jquery) ajax vers api.mon-network.net (avec l'option 'withCredentials').
1) Une pré-requête de préflight (OPTIONS) est faite, sans envoyer les crédentials (mais c'est pas grave, je me suis débrouillé sur le serveur en face pour que ça passe).
2) La vraie requête GET/POST est faite ensuite, en envoyant les credentials (le fameux cookie valide sur *.mon-network.net )... et ceci fonctionne sous Chrome, Edge, IE11.
Soucis:
- Firefox ne l'envoi pas avec les settings par défaut ("cookie tiers refusé", pour que ça fonctionne je dois baisser le settings à "seulement des sites visités", pas terrible comme solution)
- Safari n'envoi jamais le cookie, peu importe le settings.
Précision :
Le problème ne vient pas de headers CORS mal settés, j'ai passé pas mal de temps dessus, tout est niquel même pour la requête OPTIONS (confirmé avec HTTPIE), que le browser envoit le cookie ou pas avec l'OPTIONS.
Et puis le fait que ça fonctionne avec Chrome est plutôt un signe que l'erreur n'est pas là.
J'ai quelques idées de solutions, mais en voyez-vous / connaissez-vous une qui les dépasse ? Une best practice sur le sujet ?
Dans ce que j'ai pensé, il y aurait :
- faire un CNAME api.mon-site.com vers api.mon-network.net
- garder connaissance côté www.mon-site.com de la sessionID d'*.mon-network.net, et la balancer dans l'url de l'appel ajax (...&PHPSESSID= ... le truc à l'ancienne )
- laisser tomber l'idée de faire l'appel en front (ajax) et la faire en back-end, genre en php (curl/guzzle...)
- en ajax les browsers refusent de faire un setRequestHeader('Cookie') mais je pourrais peut-être envoyer un header 'Biscuit' qui lui n'est pas blacklisté, et me demerder en face pour ré-interpreter ça.
Bref, vous voyez pourquoi je cherche la best-practice
Merci d'avance.
---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3