Jak zezwolić na Kors?

Staram się wspierać CORS w moim węźle.aplikacja js, która korzysta z Express.js web framework. Przeczytałem dyskusja Grupy Google o tym, jak sobie z tym poradzić, i przeczytałem kilka artykułów o tym, jak działa CORS. Po pierwsze, zrobiłem to (kod jest napisany w składni 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'
  # ...
To chyba nie działa. Wygląda na to, że moja przeglądarka (Chrome) nie wysyła początkowego żądania opcji. Kiedy właśnie zaktualizowałem blok dla zasobu, muszę przesłać żądanie cross-origin GET do:
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'
  # ...

Działa (w Chrome). Działa to również w Safari.

Przeczytałem to...

W przeglądarce implementującej CORS, każde żądanie GET lub POST poprzedzone jest żądaniem opcji, które sprawdza, czy GET lub POST jest w porządku.

Więc moje główne pytanie brzmi, dlaczego to się nie dzieje w moim przypadku? Dlaczego nie jest moja aplikacja.blok opcji nazywa? Dlaczego muszę ustawić nagłówki w mojej głównej aplikacji.dorwać Blocka?
Author: Miles Rout, 2011-08-15

22 answers

Aby odpowiedzieć na twoje główne pytanie, Specyfikacja CORS wymaga tylko wywołania opcji poprzedzających POST lub GET, jeśli POST lub GET ma w sobie jakąś Nie prostą treść lub nagłówki.

Typy zawartości, które wymagają żądania przed lotem CORS (wywołanie opcji) są dowolnymi typami zawartości z wyjątkiem następujących :

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

Wszelkie inne typy zawartości oprócz wymienionych powyżej spowoduje uruchomienie przed lotem Prośba.

Jeśli chodzi o nagłówki, wszystkie nagłówki żądania oprócz następującego wywołają żądanie przed lotem:

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

Wszelkie inne nagłówki żądań wywołają żądanie przed lotem.

Możesz więc dodać niestandardowy nagłówek, taki jak: x-Trigger: CORS, który powinien wywołać żądanie przed lotem i nacisnąć opcje blok.

[12]}Zobacz MDN Web API Reference - Cors preflighted requests
 101
Author: Dobes Vandermeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-24 08:33:39

Odkryłem, że najprostszym sposobem jest użycie węzła.pakiet js cors . Najprostsze użycie to:

var cors = require('cors')

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

Istnieje oczywiście wiele sposobów, aby skonfigurować zachowanie do swoich potrzeb; strona podlinkowana powyżej pokazuje kilka przykładów.

 557
Author: Wayne Maurer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-02 12:02:37

Spróbuj przekazać kontrolę do następnej pasującej trasy. Jeśli Express pasuje do aplikacji.get route first, then it won ' t continued on the options route unless you do this (zauważ użycie next):

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

    next();
});

Jeśli chodzi o organizowanie rzeczy CORS, umieściłem je w middleware, który działa dobrze dla mnie:

//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
Author: evilcelery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 14:39:32

Aby pozostać w tej samej idei routingu. Używam tego kodu:

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

Podobne do http://enable-cors.org/server_expressjs.html przykład

 107
Author: Lialon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-20 10:12:11

Do

npm install cors --save

I po prostu dodaj te linie do głównego pliku, gdzie zmierza twoje żądanie.

const cors = require('cors');
const express = require('express');
let app = express();
app.use(cors());
app.options('*', cors());
 48
Author: Yatender Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-06 08:34:46

Stworzyłem bardziej kompletne oprogramowanie pośrednie odpowiednie dla express lub connect. Obsługuje OPTIONS żądania sprawdzania wstępnego. Zauważ, że pozwoli CORS dostęp do wszystkiego, może chcesz umieścić w niektórych kontroli, jeśli chcesz ograniczyć dostęp.

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
Author: mcfedr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 20:18:52

Zainstaluj moduł cors w expressjs. możesz wykonać następujące kroki >

Instalacja

npm install cors

Simple Usage (Enable All CORS Requests)

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

Aby uzyskać więcej informacji przejdź do https://github.com/expressjs/cors

 31
Author: rahuL islam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 20:37:36

Zrób coś takiego:

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
Author: Russ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-03 08:24:27

Testowanie wykonane z express + node + ionic działającym w różnych portach.

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
Author: Daniel Laurindo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-08 20:55:41

Najpierw po prostu zainstaluj cors w swoim projekcie. Weź terminal (wiersz polecenia) i cd do katalogu projektu i uruchom poniższe polecenie:

npm install cors --save

Następnie weź serwer.plik js i zmień kod, aby dodać do niego:

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();
});
To mi pomogło..
 16
Author: Reneesh TK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-16 22:37:30

To działa dla mnie, ponieważ jest to łatwa implementacja wewnątrz tras, używam meanjs i jego działa dobrze, safari, chrome, itp.

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
Author: Kiko Seijo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 20:13:59

Jakiś czas temu spotkałem się z tym problemem, więc zrobiłem to, aby umożliwić CORS w mojej aplikacji nodejs:

Najpierw musisz zainstalować cors używając poniższego polecenia:

npm install cors --save

Teraz Dodaj następujący kod do pliku startowego aplikacji, jak ( 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
Author: Shubham Verma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 05:55:14

Jeśli chcesz, aby był specyficzny dla kontrolera, możesz użyć:

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');

Należy pamiętać, że pozwoli to również na iframes.

 7
Author: Koray Gocmen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-05 22:01:59

Moim najprostszym rozwiązaniem z Expressem 4.2.0 (EDIT: chyba nie działa w 4.3.0) było:

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
});

Przypuszczam, że robienie app.all('/result', ...) też by zadziałało...

 3
Author: Pat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-22 18:13:43

Oprócz tego, co powiedzieli inni, nie zapominaj, że jeśli nie używasz nodemon, będziesz musiał ponownie uruchomić serwer węzłów, aby zmiany weszły w życie!

Osobiście odświeżałem przeglądarkę z przyzwyczajenia, zapominając, że jest to kod po stronie serwera.

 3
Author: camjocotem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-25 12:51:21

Okazało się, że bardzo łatwo jest to zrobić z pakietem npm request ( https://www.npmjs.com/package/request )

Potem oparłem swoje rozwiązanie na tym poście 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
Author: melvinv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 13:06:18

Możemy uniknąć CORS i przesłać żądania do innego serwera zamiast:

// 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
Author: Bernardo Ramos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-15 08:53:42

Użyłem następujących kroków do mojej aplikacji internetowej i odniosłem sukces:

Dodaj pakiet cors do ekspresu:

npm install cors --save

Dodaj następujące linie Po konfiguracji bodyParser . Miałem problemy z dodaniem przed bodyparserem:

 // 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
Author: Angelo Polotto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-14 13:36:07

Korzystanie z oprogramowania pośredniczącego Express działa dla mnie świetnie. Jeśli używasz już programu Express, po prostu dodaj następujące reguły oprogramowania pośredniczącego. Powinno zacząć działać.

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);
});

Odniesienie

 0
Author: Ishan Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-29 18:29:52

Może odnieść się do poniższego kodu dla tego samego. Źródło: Academind/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
Author: Gadhia Reema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-25 12:29:08

Poniższy kod zadziała, ale najpierw zainstaluj CORSA przez:

Npm install --save cors

Wtedy:

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
Author: BCool,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-02 13:54:58

W maszynopisie, jeśli chcesz użyć węzła.pakiet js 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;

Jeśli nie chcesz używać bibliotek trzeciej części do obsługi błędów cors, musisz zmienić metodę 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;

Za korzystanie z aplikacji.plik 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
Author: overcomer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-09 10:10:26