Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 20-10-2023 09:59:23

techi
Invité

Problème Node.js et CORS : dépannage du partage de ressources entre or

Je travaille sur un projet Node.js qui sert d'API backend et j'ai rencontré un problème CORS (Cross-Origin Resource Sharing). Mon API doit gérer les requêtes d'un domaine différent, mais je reçois des erreurs liées à CORS. Je recherche des conseils sur la façon de résoudre ce problème.

Voici une version simplifiée de mon code Node.js qui configure une API Express :

const express = require('express');
const app = express();
const port = 3000;

app.get('/data', (req, res) => {
    const data = { message: 'This is the API response.' };
    res.json(data);
});

app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});
 

Lorsque j'essaie de faire une requête à cette API depuis un autre domaine, je reçois une erreur CORS dans le navigateur :

Access to XMLHttpRequest at 'http://localhost:3000/data' from origin 'http://different-domain.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
 
  • Comment puis-je configurer des configurations CORS plus avancées, telles que l'autorisation de plusieurs origines ou la gestion de méthodes HTTP spécifiques ?

  • Existe-t-il des considérations de sécurité ou des bonnes pratiques dont je dois être conscient lors de la configuration de CORS dans mon application Node.js ?

Je recherche des conseils pratiques pour résoudre ce problème CORS et garantir que mon API peut accepter les demandes de différents domaines tout en maintenant la sécurité. Vos idées seraient très précieuses.

#2 26-10-2023 06:00:52

Lina89
Membre
Inscription : 17-10-2023
Messages : 1

Re : Problème Node.js et CORS : dépannage du partage de ressources entre or

Salut, je vois que tu galères avec le problème CORS. C'est assez courant quand on fait des requêtes entre différents domaines. Je vais essayer de t'aider avec quelques pistes.

La première chose à faire, c'est d'installer le module cors qui te permet de gérer facilement les headers CORS dans ton application Express. Tu peux le faire avec la commande :

npm install cors

Ensuite, tu peux utiliser le middleware cors pour activer les requêtes CORS pour toutes tes routes, ou seulement pour celles que tu veux. Par exemple, si tu veux autoriser les requêtes CORS pour la route /data, tu peux faire comme ça :

const express = require('express');
const cors = require('cors');
const app = express();
const port = 3000;

app.get('/data', cors(), (req, res) => {
const data = { message: 'This is the API response.' };
res.json(data);
});

app.listen(port, () => {
console.log(Server is running on port ${port});
});

Si tu veux autoriser les requêtes CORS pour toutes tes routes, tu peux faire comme ça :

const express = require('express');
const cors = require('cors');
const app = express();
const port = 3000;

app.use(cors());

app.get('/data', (req, res) => {
const data = { message: 'This is the API response.' };
res.json(data);
});

app.listen(port, () => {
console.log(Server is running on port ${port});
});

Par défaut, le middleware cors va ajouter le header Access-Control-Allow-Origin: * à tes réponses, ce qui veut dire que tu acceptes les requêtes de n'importe quel domaine. Si tu veux restreindre les domaines autorisés, tu peux passer des options au middleware cors, comme ça :

const express = require('express');
const cors = require('cors');
const app = express();
const port = 3000;

// Liste des domaines autorisés
const whitelist = ['http://example1.com', 'http://example2.com'];

// Options pour le middleware cors
const corsOptions = {
origin: function (origin, callback) {
// Si l'origine de la requête est dans la liste blanche, on appelle le callback avec true
if (whitelist.indexOf(origin) !== -1) {
callback(null, true);
} else {
// Sinon, on appelle le callback avec une erreur
callback(new Error('Not allowed by CORS'));
}
}
};

// On utilise le middleware cors avec les options pour la route /data
app.get('/data', cors(corsOptions), (req, res) => {
const data = { message: 'This is the API response.' };
res.json(data);
});

app.listen(port, () => {
console.log(Server is running on port ${port});
});

Tu peux aussi configurer d'autres options pour le middleware cors, comme les méthodes HTTP autorisées, les headers autorisés, etc. Tu peux trouver plus de détails sur la documentation du module corshttps://www.npmjs.com/package/cors.

Pour les requêtes complexes qui nécessitent une requête préliminaire OPTIONS, tu dois ajouter un handler pour cette méthode sur la route que tu veux supporter. Par exemple, si tu veux accepter les requêtes DELETE sur la route /data, tu peux faire comme ça :

const express = require('express');
const cors = require('cors');
const app = express();
const port = 3000;

// On active le middleware cors pour la requête OPTIONS sur la route /data
app.options('/data', cors());

// On active le middleware cors pour la requête DELETE sur la route /data
app.delete('/data', cors(), (req, res) => {
// Ici tu fais ce que tu veux pour supprimer les données
res.json({ message: 'Data deleted.' });
});

app.listen(port, () => {
console.log(Server is running on port ${port});
});

En ce qui concerne la sécurité et les bonnes pratiques, il faut être prudent avec les headers CORS et ne pas autoriser n'importe quel domaine ou n'importe quelle méthode. Il faut aussi vérifier l'authentification et l'autorisation des requêtes avant de renvoyer des données sensibles. Tu peux trouver plus d'informations sur les risques et les précautions liés à CORS sur ce site [CORS security].

J'espère que ça t'aide un peu à résoudre ton problème CORS. N'hésite pas à me dire si ça marche ou si tu as d'autres questions. Bon courage !

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt dix-neuf plus cinquante trois
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums