762 votes

Comment permettre à la SCRO à Express/NodeJS ?

Je suis en train de soutien de la SCRO dans mon NodeJS application qui utilise l'Express JS framework web. J'ai lu un Google groupe de discussion sur la façon de gérer cela, et de lire quelques articles sur la façon de la SCRO œuvres. Tout d'abord, je l'ai fait (le code est écrit en CoffeeScript syntaxe):

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'
  # ...

Il ne semble pas fonctionner. Il semble que mon navigateur (Chrome) n'est pas l'envoi de la première demande d'OPTIONS. Quand je l'ai juste mis à jour le bloc de la ressource j'ai besoin de soumettre un cross-origin requête GET:

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 (dans Chrome). Cela fonctionne aussi dans Safari.

J'ai lu que...

Dans un navigateur de mise en œuvre de la SCRO, chaque croix-origine requête GET ou POST est précédée par une demande d'OPTIONS qui vérifie si le GET ou POST, c'est OK.

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

727voto

Wayne Maurer Points 1349

J’ai trouvé que le moyen le plus simple est d’utiliser le paquet de node.js SCRO. L’utilisation la plus simple est :

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

474voto

evilcelery Points 7371

Essayez de passer le contrôle à l’itinéraire correspondant suivant. Si l’Express est correspondant app.get itinéraire tout d’abord, puis il ne sera pas continuer sur la route d’options sauf si vous faites cette (Notez l’utilisation de la prochaine):

En termes d’organiser les choses de la SCRO, je l’ai mis dans un middleware qui fonctionne bien pour moi :

221voto

Dobes Vandermeer Points 1846

Pour répondre à votre question principale, la spécification de la SCRO nécessite uniquement les OPTIONS appel à précéder le POST ou GET si le POST ou GET a tout non simple contenu ou en-têtes dedans.

Voir « Demandes de Preflighted » dans https://developer.mozilla.org/En/HTTP_access_control

134voto

Lialon Points 438

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

Semblable à l’exemple de http://enable-cors.org/server_expressjs.html

64voto

mcfedr Points 1193

J'ai fait un middleware plus complet adapté à l'express ou à la connexion. Il prend en charge OPTIONS demandes de vérification en amont. Notez qu'il permettra à CORS d'accéder à n'importe quoi, vous pourriez vouloir mettre quelques contrôles 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();
    }
});
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X