DEV Community

lawalalao
lawalalao

Posted on

Devenez Un Dompteur Du Cors đŸ§™â€â™€ïž

Yeah, c'est enfin arrivĂ© ! đŸ˜Č Vous avez bossĂ© dur pour dĂ©velopper votre application web frontend, mais dĂšs que vous tentez d'accĂ©der Ă  une ressource sur un autre serveur pour l'afficher dans votre appli, vous vous tapez l'erreur CORS de l'enfer. Mais no soucis, je vais vous remettre tout ça d'Ă©querre en vous expliquant ce que c'est que le CORS, pourquoi vous vous tapez toujours ces erreurs CORS et quelques astuces pour les rĂ©soudre. Bien sĂ»r, y'a sĂ»rement d'autres alternatives, alors hĂ©sitez pas Ă  les partager avec moi et tous les autres lecteurs... Let'ssss gooooo !

Terminologie CORS

Avant d'entrer dans le vif du sujet, passons en revue quelques termes importants.

  • L'origine est une url composĂ©e de trois parties :

    • SchĂ©ma URI: par exemple http:// ou https://
    • Nom d'hĂŽte: comme twitter.com
    • NumĂ©ro de port: par exemple 80 pour HTTP et 443 pour HTTPS. Vous ne les verrez jamais dans votre barre d'adresse, car cela est pris en charge en background, mais essayez de coller https://twitter.com:443 dans votre barre d'adresse et vous allez remarquer qu'il vous dirige automatiquement vers le site web attendu.
  • Les requĂȘtes HTTP sont des requĂȘtes qu'une application web effectue pour accĂ©der aux ressources d'une application. Il existe diffĂ©rents types de requĂȘtes HTTP, notamment GET (qui vous permet d'obtenir des ressources), DELETE (qui vous permet de supprimer des ressources), etc. Vous trouverez ci-dessous un exemple de requĂȘte GET :,

    • lorsque vous utilisez twitter dans votre navigateur pour cliquer sur le profil d'une personne et que vous souhaitez voir ses tweets. L'application web envoie une requĂȘte HTTP au serveur Ă  l'adresse http://twitter-api.com qui rĂ©pond avec les tweets de cette personne pour que vous puissiez les voir.

Diagram of a sample HTTP Get Request

  • Demande d'origine croisĂ©e đŸ€ŁđŸ€ŁđŸ˜‚ (Cross-Origin Request) c'est lorsqu'une demande est faite Ă  partir d'une origine vers une autre origine. Exemple ? Vous recherchez des images de chats sur https://flikr.com et cette application interroge https://image.com/api pour demander que des photos de chats soient affichĂ©es pour vous.

    Diagram of a Sample Cross Origin Request

  • Les en-tĂȘtes HTTP (HTTP HEADERS) sont des donnĂ©es qui dĂ©crivent la requĂȘte ou la rĂ©ponse envoyĂ©e. Ils fournissent des informations supplĂ©mentaires, un peu comme la bio de votre profil Twitter. Des exemples d'en-tĂȘtes tels que Host et access-control-allow-origin sont prĂ©sentĂ©s dans l'image ci-dessous.

    Diagram of an HTTP response with headers

Un proxy est un serveur qui sert d'intermédiaire entre un client (votre navigateur) et un autre serveur.

Qu'est-ce que CORS ?

CORS (Cross Origin Resource Sharing) est un ensemble de rĂšgles que tous les navigateurs mettent en place pour sĂ©curiser les applications web contre les accĂšs indĂ©sirables (+1 pour la sĂ©curitĂ© đŸ„ł). (+1 pour la sĂ©curitĂ© đŸ„ł) L'une des mĂ©thodes utilisĂ©es par les navigateurs consiste Ă  vĂ©rifier la prĂ©sence d'informations spĂ©cifiques dans une rĂ©ponse HTTP, qui lui permettent de savoir que l'application web qui demande une ressource a reçu l'autorisation de le faire. C'est le comportement par dĂ©faut du navigateur, sauf s'il sait dĂ©jĂ  qu'une application web a accĂšs Ă  une ressource.

Meme of spongebob checking response headers

Comment fonctionne CORS ?

À un niveau Ă©levĂ©, selon le type de requĂȘte effectuĂ©e, CORS fonctionne de deux maniĂšres. Examinons les deux dans le contexte de l'obtention ou de la modification d'un tweet (oui, ça existe maintenant).

  1. Lorsque votre application web veut rĂ©cupĂ©rer un tweet SANS le modifier, le navigateur vĂ©rifie que la rĂ©ponse contient un en-tĂȘte access-control-allow-origin qui correspond Ă  l'origine de l'application twitter requĂ©rante (par exemple, https://twitter.com), ou un * pour indiquer au navigateur que toutes les origines sur le web y ont accĂšs. C'est le comportement typique des requĂȘtes GET.

  2. Lorsque votre application web souhaite METTRE À JOUR un tweet, plusieurs choses se produisent.

* Le navigateur envoie une prĂ©-requĂȘte, qui est une petite requĂȘte de type **OPTIONS**, qui donne au serveur des informations sur la requĂȘte que vous essayez d'envoyer pour mettre Ă  jour votre tweet. L'application backend examine les **en-tĂȘtes** fournis dans la prĂ©-requĂȘte afin de dĂ©terminer si la requĂȘte que vous souhaitez effectuer est autorisĂ©e. Certains des en-tĂȘtes ajoutĂ©s Ă  la prĂ©-requĂȘte sont [**Access-Control-Request-Method**](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Request-Method) et [**Access-Control-Request-Headers.**](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Request-Headers) Ils donnent au serveur des informations telles que la mĂ©thode de la requĂȘte, etc. Cette couche supplĂ©mentaire de protection est utile car les requĂȘtes qui peuvent modifier les ressources sont plus susceptibles d'avoir des effets nĂ©fastes que les requĂȘtes qui ne le peuvent pas.

* Une fois que le serveur a reçu la demande (prĂ©-requĂȘte), il rĂ©pond et vous fait savoir s'il a acceptĂ© une demande ou pas selon les paramĂštres que vous lui avez donnĂ©s dans les en-tĂȘtes . Vous trouverez ci-dessous une explication simplifiĂ©e de la conversation entre le navigateur et le serveur backend.

    ![Conversation between browser and server, but make them both toddlers](https://cdn.hashnode.com/res/hashnode/image/upload/v1666772758378/xVPfKzFuc.png?auto=compress,format&format=webp align="left")
Enter fullscreen mode Exit fullscreen mode

Pourquoi obtenez-vous une erreur CORS ? 🙄

L'une des principales raisons des erreurs CORS dans le dĂ©veloppement est que le serveur auquel vous envoyez une requĂȘte peut ne pas inclure l'en-tĂȘte access-control-allow-origin dans les rĂ©ponses qu'il vous renvoie. Ou s'il le fait, il n'inclut pas l'URL de votre application frontend dans la liste des origines approuvĂ©es. Les solutions ci-dessous visent Ă  remĂ©dier Ă  ce problĂšme. Vous pouvez trouver une longue liste d'autres causes d'erreurs CORS ici.

Quelques moyens de résoudre les erreurs CORS

  1. Activer CORS sur le backend : A quoi cela ressemble-t-il ? L'activation de CORS et l'ajout de l'origine de votre application frontend à la liste des origines approuvées pour l'API.
* **Avantage** : vous pouvez résoudre le problÚme en interne en quelques lignes de code.

* **Inconvénient** : Vous devez faire des mises à jour dans le backend, ce à quoi vous n'avez pas forcément accÚs.

* **Exemple** : Voici comment j'ai procédé pour un projet récent sur lequel je travaillais en utilisant le framework Phoenix elixir pour mon backend. Tout d'abord, j'ai trouvé une bibliothÚque CORS appelée **Corsica** qui ajouterait l'origine de mon front-end à la liste des origines approuvées. Ensuite, je l'ai ajoutée en tant que dépendance (une dépendance est un code tiers dont votre code a besoin pour fonctionner) à mon projet de backend. Dans elixir, vous ajoutez une nouvelle dépendance dans votre fichier mix.exs comme indiqué ci-dessous.

*
Enter fullscreen mode Exit fullscreen mode
            defp deps do 
            [
             ...
             {:corsica, "~> 1.1.3"} 
            ] 
            end
        ```



        Ensuite, j'ai ajouté l'origine de mes applications web frontend à la liste des origines approuvées en ajoutant Corsica, et en plaçant l'origine de mon frontend dans la liste des origines approuvées pour accéder aux ressources de mon backend.




```erb
plug Corsica, origins: ["http://localhost:3000"]
Enter fullscreen mode Exit fullscreen mode

En fonction du backend que vous choisissez, vous pouvez définir l'URL d'origine en fonction de l'environnement dans lequel vous vous trouvez. Vous suivrez une approche similaire pour activer CORS sur le backend dans de nombreux frameworks backend.

  1. Envoyez vos requĂȘtes Ă  un proxy qui ajoute les en-tĂȘtes attendus Ă  la rĂ©ponse. Le code pour cela se trouve dans votre application frontend. Mais qu'est-ce que cela signifie exactement ? Au lieu que votre application envoie des requĂȘtes Ă  https://twitter.com/, vous pouvez utiliser un proxy CORS comme CORS anywhere qui est situĂ© Ă  https://cors-anywhere.herokuapp.com/ comme ceci -> https://cors-anywhere.herokuapp.com/https://twitter.com.
  • Avantage : vous n'obtenez plus l'erreur CORS et vous avez dĂ©sormais accĂšs aux ressources que vous demandiez, car l'en-tĂȘte attendu a Ă©tĂ© ajoutĂ© par le proxy CORS.

  • InconvĂ©nient : La demande peut potentiellement prendre plus de temps Ă  ĂȘtre satisfaite car vous serez Ă  la merci de la vitesse Ă  laquelle le proxy externe envoie, reçoit et met Ă  jour la rĂ©ponse pour inclure l'en-tĂȘte dont CORS a besoin pour ĂȘtre satisfait. De plus, vous devez faire confiance Ă  100% au proxy, car il peut lire et faire n'importe quoi avec la rĂ©ponse que vous attendez en retour. Je dĂ©conseille fortement l'utilisation d'un proxy pour tout ce qui n'est pas des donnĂ©es triviales.

    Proxy.png

  1. Envoyez vos requĂȘtes Ă  votre propre proxy afin de rĂ©duire les lenteurs potentielles liĂ©es Ă  l'attente d'un proxy externe qui ajouterait les en-tĂȘtes pour vous.
  • Avantage : vous n'avez pas besoin d'apporter de modifications au back-end. Vous pouvez allouer autant de ressources que vous le souhaitez Ă  votre proxy pour rĂ©duire les lenteurs.

  • InconvĂ©nient : Vous devrez gĂ©rer les ressources de votre proxy, mais il est probable que si vous hĂ©bergez une application back-end, cet inconvĂ©nient ne soit pas si important. Vous pouvez voir un exemple de comment faire ici.

  1. DĂ©sactiver temporairement CORS sur votre navigateur
* Avantage : vous pouvez dĂ©velopper et tester immĂ©diatement les requĂȘtes de votre navigateur vers des sources croisĂ©es.

  • InconvĂ©nient : Cette mĂ©thode ne doit ĂȘtre utilisĂ©e que temporairement et ne fonctionne qu'en phase de dĂ©veloppement.

    L'erreur CORS subsistera lorsque vous déployerez votre application en production. Selon le navigateur que vous utilisez, vous pouvez soit installer une extension pour contourner CORS, OU si vous utilisez Safari, vous pouvez manuellement désactiver CORS temporairement en activant le menu développeur et en cliquant sur l'option ci-dessous :

Screen Shot 2022-10-24 at 8.54.26 PM.jpg

Enter fullscreen mode Exit fullscreen mode




RĂ©capitulatif

Pour faire court, CORS est un ensemble de rĂšgles que chaque navigateur a universellement mis en place pour assurer la sĂ©curitĂ© d'une application web et de ses utilisateurs. Et comme la plupart des choses dans le monde du dĂ©veloppement, il existe plusieurs mĂ©thodes pour corriger toute erreur CORS potentielle. Je sais qu'elles peuvent ĂȘtre un casse-tĂȘte, mais maintenant que vous savez de quoi il s'agit et que vous connaissez quelques mĂ©thodes pour les rĂ©soudre, c'est gagnĂ© !

Maintenant, allez, donnez Ă  ces erreurs CORS une bonne correction đŸ’Ș

goku-jumping-goku.gif

Vous voulez descendre dans le trou du lapin ? Voici quelques lectures complémentaires en anglais :

Alors vous aimé cet article ? n'hésitez pas à le partager autour de vous et abonnez-vous ... Surtout n'hésitez pas à partager avec moi et d'autres lecteurs d'autres moyens pour résoudre les erreurs CORS. Merci

Top comments (0)