Comment autoriser CORS?

j'essaie de supporter CORS dans mon noeud.js application qui utilise L'Express.js web framework. J'ai lu une discussion de groupe sur Google sur la façon de gérer cela, et j'ai lu quelques articles sur le fonctionnement de la CORS. Tout d'abord, j'ai fait ceci (le code est écrit dans la syntaxe CoffeeScript):

app.options "*", (req, res) ->
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  # try: 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
  # try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

ça ne semble pas marcher. Il semble que mon navigateur (Chrome) n'envoie pas la demande D'OPTIONS initiale. Quand je viens de mettre à jour le bloc pour la ressource I besoin de soumettre une demande d'origine croisée:

app.get "/somethingelse", (req, res) ->
  # ...
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

il fonctionne (en Chrome). Cela fonctionne aussi en Safari.

j'ai lu ça...

dans un navigateur implémentant CORS, chaque requête GET ou POST d'origine croisée est précédée d'une requête D'OPTIONS qui vérifie si le GET ou POST est OK.

alors ma question principale est, comment se fait-il que cela ne semble pas se produire dans mon cas? Pourquoi n'est-ce pas l'une de mes applications.le bloc des options a appelé? Pourquoi ai-je besoin pour définir les en-têtes dans mon application principale.obtenez de bloc?

502
demandé sur Miles Rout 2011-08-15 20:53:23

22 réponses

pour répondre à votre question principale, le cors spec exige seulement L'appel D'OPTIONS pour précéder le POST ou obtenir si le POST ou obtenir a un contenu non simple ou des en-têtes dans elle.

Types de Contenu qui nécessitent une SCRO pré-vol à la demande (les OPTIONS d'appel) sont tout Content-Type à l'exception de ce qui suit :

  1. application/x-www-form-urlencoded
  2. multipart/form-data
  3. text/plain

tout autre type de contenu que ceux énumérés ci-dessus déclenchera une demande pré-vol.

comme pour les en-têtes, tous les en-têtes de demande sauf le suivant déclencheront une demande pré-vol:

  1. Accept
  2. Accept-Language
  3. Content-Language
  4. Content-Type
  5. DPR
  6. Save-Data
  7. Viewport-Width
  8. Width

tout autre en-tête de demande déclenche la demande pré-vol.

ainsi, vous pouvez ajouter un en-tête personnalisé tel que: x-Trigger: CORS , et qui devrait déclencher la requête pré-vol et frapper le bloc OPTIONS.

Voir MDN Web Référence de l'API - SCRO Contrôlé demandes

101
répondu Dobes Vandermeer 2018-09-24 08:33:39

j'ai trouvé que la façon la plus facile est d'utiliser le noeud.paquet js cors . L'usage le plus simple est:

var cors = require('cors')

var app = express()
app.use(cors())

Il y a bien sûr plusieurs façons de configurer le comportement de vos besoins; la page liée ci-dessus montre un certain nombre d'exemples.

557
répondu Wayne Maurer 2014-08-02 12:02:37

essayez de passer le contrôle à la prochaine route correspondante. Si Express correspond à app.obtenir route d'abord, puis il ne va pas continuer sur la route d'options à moins que vous ne fassiez ce (notez l'utilisation de la prochaine) :

app.get('somethingelse', function(req, res, next) {
    //..set headers etc.

    next();
});

en termes d'organisation des affaires CORS, Je l'ai mis dans un middleware qui fonctionne bien pour moi:

//CORS middleware
var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'example.com');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');

    next();
}

//...
app.configure(function() {
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.session({ secret: 'cool beans' }));
    app.use(express.methodOverride());
    app.use(allowCrossDomain);
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
});
406
répondu evilcelery 2014-08-29 14:39:32

Pour rester dans la même idée de routage. J'utilise ce code:

app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

similaire à http://enable-cors.org/server_expressjs.html exemple

107
répondu Lialon 2014-10-20 10:12:11

faire

npm install cors --save

et ajoutez ces lignes dans votre fichier principal où en est votre demande.

const cors = require('cors');
const express = require('express');
let app = express();
app.use(cors());
app.options('*', cors());
48
répondu Yatender Singh 2017-05-06 08:34:46

j'ai fait un middleware plus complet adapté pour express ou connect. Il prend en charge les demandes OPTIONS pour la vérification avant vol. Notez qu'il permettra à CORS d'accéder à n'importe quoi, vous pourriez vouloir mettre quelques vérifications si vous voulez limiter l'accès.

app.use(function(req, res, next) {
    var oneof = false;
    if(req.headers.origin) {
        res.header('Access-Control-Allow-Origin', req.headers.origin);
        oneof = true;
    }
    if(req.headers['access-control-request-method']) {
        res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']);
        oneof = true;
    }
    if(req.headers['access-control-request-headers']) {
        res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']);
        oneof = true;
    }
    if(oneof) {
        res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365);
    }

    // intercept OPTIONS method
    if (oneof && req.method == 'OPTIONS') {
        res.send(200);
    }
    else {
        next();
    }
});
46
répondu mcfedr 2014-02-06 20:18:52

installe le module cors d'expressjs. vous pouvez suivre ces étapes >

Installation

npm install cors

usage Simple (Activer toutes les requêtes CORS)

var express = require('express');
var cors = require('cors');
var app = express();
app.use(cors());

pour plus de détails, allez à https://github.com/expressjs/cors

31
répondu rahuL islam 2016-06-15 20:37:36

Faire quelque chose comme ceci:

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});
29
répondu Russ 2016-01-03 08:24:27

test effectué avec express + node + Ionic dans les ports differente.

Localhost:8100

Localhost:5000

// CORS (Cross-Origin Resource Sharing) headers to support Cross-site HTTP requests

app.all('*', function(req, res, next) {
       res.header("Access-Control-Allow-Origin", "*");
       res.header("Access-Control-Allow-Headers", "X-Requested-With");
       res.header('Access-Control-Allow-Headers', 'Content-Type');
       next();
});
18
répondu Daniel Laurindo 2014-11-08 20:55:41

installez tout d'abord cors dans votre projet. Prenez le terminal (invite de commande) et cd dans votre répertoire de projet et lancez la commande suivante:

npm install cors --save

puis prendre le serveur.js fichier et modifier le code pour ajouter ce qui suit:

var cors = require('cors');


var app = express();

app.use(cors());

app.use(function(req, res, next) {
   res.header("Access-Control-Allow-Origin", "*");
   res.header('Access-Control-Allow-Methods', 'DELETE, PUT, GET, POST');
   res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
   next();
});

ça a marché pour moi..

16
répondu Reneesh TK 2017-09-16 22:37:30

cela fonctionne pour moi, comme son une mise en œuvre facile à l'intérieur des routes, im en utilisant meanjs et son bon fonctionnement, safari, chrome, etc.

app.route('/footer-contact-form').post(emailer.sendFooterMail).options(function(req,res,next){ 
        res.header('Access-Control-Allow-Origin', '*'); 
        res.header('Access-Control-Allow-Methods', 'GET, POST');
        res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
        return res.send(200);

    });
10
répondu Kiko Seijo 2015-08-24 20:13:59

il y a quelque temps, j'ai fait face à ce problème donc je l'ai fait pour autoriser CORS dans mon application nodejs:

D'abord vous besoin d'installer cors en utilisant la commande ci-dessous:

npm install cors --save

maintenant ajouter le code suivant à votre application démarrer le fichier comme ( app.js or server.js )

var express = require('express');
var app = express();

var cors = require('cors');
var bodyParser = require('body-parser');

//enables cors
app.use(cors({
  'allowedHeaders': ['sessionId', 'Content-Type'],
  'exposedHeaders': ['sessionId'],
  'origin': '*',
  'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
  'preflightContinue': false
}));

require('./router/index')(app);
9
répondu Shubham Verma 2018-05-01 05:55:14

si vous voulez le rendre spécifique au contrôleur, vous pouvez utiliser:

res.setHeader('X-Frame-Options', 'ALLOWALL');
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');

veuillez noter que cela permettra également les iframes.

7
répondu Koray Gocmen 2018-01-05 22:01:59

Ma solution la plus simple à Exprimer 4.2.0 (EDIT: Ne semble pas fonctionner en 4.3.0) a été:

function supportCrossOriginScript(req, res, next) {
    res.status(200);
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type");

    // res.header("Access-Control-Allow-Headers", "Origin");
    // res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    // res.header("Access-Control-Allow-Methods","POST, OPTIONS");
    // res.header("Access-Control-Allow-Methods","POST, GET, OPTIONS, DELETE, PUT, HEAD");
    // res.header("Access-Control-Max-Age","1728000");
    next();
}

// Support CORS
app.options('/result', supportCrossOriginScript);

app.post('/result', supportCrossOriginScript, function(req, res) {
    res.send('received');
    // do stuff with req
});

je suppose que faire app.all('/result', ...) marcherait aussi...

3
répondu Pat 2014-05-22 18:13:43

en plus de ce que d'autres ont dit, n'oubliez pas qu'à moins d'utiliser nodemon, vous devrez redémarrer votre serveur de noeuds pour que les changements prennent effet!

personnellement, j'avais rafraîchi mon navigateur par habitude, oubliant que c'est du code côté serveur.

3
répondu camjocotem 2016-03-25 12:51:21

j'ai trouvé qu'il était extrêmement facile de faire cela avec le paquet de requête npm ( https://www.npmjs.com/package/request )

alors j'ai basé ma solution sur ce post http://blog.javascripting.com/2015/01/17/dont-hassle-with-cors /

'use strict'

const express = require('express');
const request = require('request');

let proxyConfig = {
    url : {
        base: 'http://servertoreach.com?id=',
    }
}

/* setting up and configuring node express server for the application */
let server = express();
server.set('port', 3000);


/* methods forwarded to the servertoreach proxy  */
server.use('/somethingElse', function(req, res)
{
    let url = proxyConfig.url.base + req.query.id;
    req.pipe(request(url)).pipe(res);
});


/* start the server */
server.listen(server.get('port'), function() {
    console.log('express server with a proxy listening on port ' + server.get('port'));
});
2
répondu melvinv 2016-02-10 13:06:18

nous pouvons éviter les CORS et transmettre les requêtes à l'autre serveur à la place:

// config:
var public_folder = __dirname + '/public'
var apiServerHost = 'http://other.server'

// code:
console.log("starting server...");

var express = require('express');
var app = express();
var request = require('request');

// serve static files
app.use(express.static(public_folder));

// if not found, serve from another server
app.use(function(req, res) {
    var url = apiServerHost + req.url;
    req.pipe(request(url)).pipe(res);
});

app.listen(80, function(){
    console.log("server ready");
});
1
répondu Bernardo Ramos 2016-05-15 08:53:42

j'ai utilisé les étapes suivantes à mon application web et j'ai eu du succès:

ajouter le paquet cors à l'express:

npm install cors --save

ajouter les lignes suivantes: après la configuration du bodyParser . J'ai eu quelques difficultés à ajouter avant bodyParser:

 // enable cors to the server
const corsOpt = {
    origin: process.env.CORS_ALLOW_ORIGIN || '*', // this work well to configure origin url in the server
    methods: ['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS'], // to works well with web app, OPTIONS is required
    allowedHeaders: ['Content-Type', 'Authorization'] // allow json and token in the headers
};
app.use(cors(corsOpt)); // cors for all the routes of the application
app.options('*', cors(corsOpt)); // automatic cors gen for HTTP verbs in all routes, This can be redundant but I kept to be sure that will always work.
0
répondu Angelo Polotto 2018-06-14 13:36:07

utilisant L'Middleware Express fonctionne très bien pour moi. Si vous utilisez déjà Express, vous n'avez qu'à ajouter les règles middleware suivantes. Il devrait commencer à travailler.

app.all("/api/*", function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
  res.header("Access-Control-Allow-Methods", "GET, PUT, POST");
  return next();
});

app.all("/api/*", function(req, res, next) {
  if (req.method.toLowerCase() !== "options") {
    return next();
  }
  return res.send(204);
});

référence

0
répondu Ishan Patel 2018-08-29 18:29:52

peut renvoyer le code ci-dessous pour le même. Source: Acadiemind / node-restful-api

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

//acts as a middleware
//to handle CORS Errors
app.use((req, res, next) => { //doesn't send response just adjusts it
    res.header("Access-Control-Allow-Origin", "*") //* to give access to any origin
    res.header(
        "Access-Control-Allow-Headers",
        "Origin, X-Requested-With, Content-Type, Accept, Authorization" //to give access to all the headers provided
    );
    if(req.method === 'OPTIONS'){
        res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET'); //to give access to all the methods provided
        return res.status(200).json({});
    }
    next(); //so that other routes can take over
})
0
répondu Gadhia Reema 2018-09-25 12:29:08

ci-dessous code fonctionnera ,mais d'abord installer cors par:

npm install --enregistrer la scro

puis:

module.exports = function(app) { 
var express = require("express");
var cors = require('cors');
var router = express.Router();
app.use(cors());

app.post("/movies",cors(), function(req, res) { 
res.send("test");
});
0
répondu BCool 2018-10-02 13:54:58

en typographie, si vous voulez utiliser le noeud.js package cors

/**
* app.ts
* If you use the cors library
*/

import * as express from "express";
[...]
import * as cors from 'cors';

class App {
   public express: express.Application;

   constructor() {
       this.express = express();
       [..]
       this.handleCORSErrors();
   }

   private handleCORSErrors(): any {
       const corsOptions: cors.CorsOptions = {
           origin: 'http://example.com',
           optionsSuccessStatus: 200
       };
       this.express.use(cors(corsOptions));
   }
}

export default new App().express;

si vous ne voulez pas utiliser les bibliothèques de troisième partie pour la gestion des erreurs cors, vous devez changer la méthode handleCORSErrors ().

/**
* app.ts
* If you do not use the cors library
*/

import * as express from "express";
[...]

class App {
   public express: express.Application;

   constructor() {
       this.express = express();
       [..]
       this.handleCORSErrors();
   }

   private handleCORSErrors(): any {
       this.express.use((req, res, next) => {
           res.header("Access-Control-Allow-Origin", "*");
           res.header(
               "Access-Control-ALlow-Headers",
               "Origin, X-Requested-With, Content-Type, Accept, Authorization"
           );
           if (req.method === "OPTIONS") {
               res.header(
                   "Access-Control-Allow-Methods",
                   "PUT, POST, PATCH, GET, DELETE"
               );
               return res.status(200).json({});
           } 
           next(); // send the request to the next middleware
       });
    }
}

export default new App().express;

Pour l'utilisation de l'application.fichier ts

/**
* server.ts
*/
import * as http from "http";
import app from "./app";

const server: http.Server = http.createServer(app);

const PORT: any = process.env.PORT || 3000;
server.listen(PORT);
-2
répondu overcomer 2018-07-09 10:10:26