Si vous rencontrez des problèmes avec une requête AJAX et que vous pensez que l’erreur pourrait être due à la directive de politique de sécurité du contenu (CSP) strict-origin-when-cross-origin, voici quelques éléments que vous pouvez essayer pour résoudre le problème (observez-les dans la console d’erreur de Chrome Devtools) :
- Assurez-vous que le serveur est configuré pour inclure l’en-tête
Access-Control-Allow-Origindans la réponse à la requête de pré-vérification ainsi qu’à la requête AJAX réelle. Cet en-tête permet à la ressource d’être accessible depuis l’origine spécifiée.
Voici un exemple de la façon dont vous pouvez configurer l’en-tête Access-Control-Allow-Origin dans un serveur Node.js à l’aide de la bibliothèque cors :
const cors = require('cors');
app.use(cors({
origin: 'http://example.com',
optionsSuccessStatus: 200
}));
Alternativement, vous pouvez inclure l’en-tête Access-Control-Allow-Origin directement dans votre code côté serveur. Par exemple, dans un serveur Node.js, vous pouvez définir l’en-tête comme ceci :
res.setHeader('Access-Control-Allow-Origin', '*');
- Assurez-vous que le serveur est configuré pour autoriser les en-têtes utilisés dans la requête de pré-vérification et la requête AJAX réelle. Cela peut être fait en incluant ces en-têtes dans l’en-tête
Access-Control-Allow-Headers.
Voici un exemple de la façon dont vous pouvez configurer l’en-tête Access-Control-Allow-Headers dans un serveur Node.js :
const http = require('http');
const server = http.createServer((req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*'); // Ajoutez cette ligne pour autoriser l'accès à la ressource depuis n'importe quelle origine
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS'); // Ajoutez cette ligne pour autoriser l'utilisation des méthodes HTTP spécifiées
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, discourse-present, discourse-logged-in, discourse-track-view'); // Ajoutez cette ligne pour autoriser l'utilisation des en-têtes spécifiés
if (req.url === '/getTopicLikes') {
console.log('Requête reçue');
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ likes: 100 }));
} else {
res.writeHead(404);
res.end();
}
});
server.listen(3000, () => {
console.log('Serveur démarré sur le port 3000');
});
process.on('SIGINT', () => {
console.log('Arrêt du serveur');
server.close();
});
Veuillez noter les deux en-têtes d’autorisation supplémentaires spécifiques à Discourse :
discourse-present, discourse-logged-in, discourse-track-view
J’espère que ces étapes vous aideront à résoudre le problème avec votre requête AJAX. N’hésitez pas à me faire savoir si vous avez des questions.