web-dev-qa-db-fra.com

Comment puis-je prendre en charge cors lors de l'utilisation de restify

J'ai une REST api créée avec le module restify et je souhaite autoriser le partage de ressources entre origines Quelle est la meilleure façon de le faire?

40
Kim

Vous devez configurer le serveur pour définir les en-têtes croisés d'origine. Pas sûr s'il y a une fonction d'utilisation intégrée ou non, alors j'ai écrit la mienne.

server.use(
  function crossOrigin(req,res,next){
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    return next();
  }
);

J'ai trouvé cela dans ce tutoriel. http://backbonetutorials.com/nodejs-restify-mongodb-mongoose/

53
Stephen Reid

La dernière version de Restify fournit un plugin pour gérer CORS .

Donc, vous pouvez maintenant l'utiliser comme ceci:

server.use(restify.CORS({

  // Defaults to ['*'].
  origins: ['https://foo.com', 'http://bar.com', 'http://baz.com:8081'], 

  // Defaults to false.
  credentials: true,

  // Sets expose-headers.
  headers: ['x-foo']   

}));
63

Cela fonctionne pour moi:

var restify = require('restify');

var server = restify.createServer();

server.use(restify.CORS());

server.opts(/.*/, function (req,res,next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", req.header("Access-Control-Request-Method"));
    res.header("Access-Control-Allow-Headers", req.header("Access-Control-Request-Headers"));
    res.send(200);
    return next();
});

server.get('/test', function (req,res,next) {

    res.send({
        status: "ok"
    });
    return next();
});

server.listen(3000, function () {
    console.log('%s listening at %s', server.name, server.url);
});
14
Cyrusmith

C'est ce qui a fonctionné pour moi:

function unknownMethodHandler(req, res) {
  if (req.method.toLowerCase() === 'options') {
      console.log('received an options method request');
    var allowHeaders = ['Accept', 'Accept-Version', 'Content-Type', 'Api-Version', 'Origin', 'X-Requested-With']; // added Origin & X-Requested-With

    if (res.methods.indexOf('OPTIONS') === -1) res.methods.Push('OPTIONS');

    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Headers', allowHeaders.join(', '));
    res.header('Access-Control-Allow-Methods', res.methods.join(', '));
    res.header('Access-Control-Allow-Origin', req.headers.Origin);

    return res.send(204);
  }
  else
    return res.send(new restify.MethodNotAllowedError());
}

server.on('MethodNotAllowed', unknownMethodHandler);

Ce code provient de https://github.com/mcavage/node-restify/issues/284

9
Pavel Nikolov

CORS Plugin est obsolète en faveur de https://github.com/Tabcorp/restify-cors-middleware . (Source: https://github.com/restify/node-restify/issues/1091 .)

Vous trouverez ci-dessous un exemple de code concernant l'utilisation

const corsMiddleware = require('restify-cors-middleware')

const cors = corsMiddleware({
  preflightMaxAge: 5, //Optional
  origins: ['http://api.myapp.com', 'http://web.myapp.com'],
  allowHeaders: ['API-Token'],
  exposeHeaders: ['API-Token-Expiry']
})

server.pre(cors.preflight)
server.use(cors.actual)
5
techgyani

Pour activer CORS pour l'authentification de base, j'ai procédé comme suit. Cela ne fonctionnait pas tant que les méthodes .pre n'étaient pas utilisées à la place des méthodes .use

server.pre(restify.CORS({
  origins: ['https://www.allowedip.com'],  // defaults to ['*']
  credentials: true,
  headers: ['X-Requested-With', 'Authorization']
}));
server.pre(restify.fullResponse());

function unknownMethodHandler(req, res) {
    if (req.method.toLowerCase() === 'options') {
      var allowHeaders = ['Accept', 'Accept-Version', 'Content-Type', 'Api-Version', 'Origin', 'X-Requested-With', 'Authorization']; // added Origin & X-Requested-With & **Authorization**

      if (res.methods.indexOf('OPTIONS') === -1) res.methods.Push('OPTIONS');

      res.header('Access-Control-Allow-Credentials', true);
      res.header('Access-Control-Allow-Headers', allowHeaders.join(', '));
      res.header('Access-Control-Allow-Methods', res.methods.join(', '));
      res.header('Access-Control-Allow-Origin', req.headers.Origin);

      return res.send(200);
   } else {
      return res.send(new restify.MethodNotAllowedError());
   }
}

server.on('MethodNotAllowed', unknownMethodHandler);
4
Mel

Si quelqu'un découvre cela en février 2018, un bogue semble avoir été introduit, je ne pouvais pas faire fonctionner le restify-cors-middleware.

J'utilise ce travail pour le moment:

server.pre((req, res, next) => {
   res.header("Access-Control-Allow-Origin", "*");
   next();
});
3
Giuseppe

La plupart des réponses précédentes datent de 2013 et utilisent des exemples dépréciés! La solution (au moins en 2017) est la suivante:

npm install restify-cors-middleware

Puis dans votre fichier javascript du serveur:

var corsMiddleware = require('restify-cors-middleware');

var cors = corsMiddleware({
  preflightMaxAge: 5,
  origins: ['*']
});

var server = restify.createServer();

server.pre(cors.preflight);
server.use(cors.actual);

Et ajoutez toutes les autres options supplémentaires qui fonctionnent pour vous. Mon cas d'utilisation consistait à créer un proxy localhost pour résoudre les problèmes liés à la CORS du navigateur pendant le développement. Pour info, j'utilise restify comme serveur, mais mon POST depuis le serveur (et vers le serveur) est chez Axios. Ma préférence là-bas.

Liste npm pour le middleware restify-cors

3
MattC

Je le fais comme ça sur mon application de base Restify:

//setup cors
restify.CORS.ALLOW_HEADERS.Push('accept');
restify.CORS.ALLOW_HEADERS.Push('sid');
restify.CORS.ALLOW_HEADERS.Push('lang');
restify.CORS.ALLOW_HEADERS.Push('Origin');
restify.CORS.ALLOW_HEADERS.Push('withcredentials');
restify.CORS.ALLOW_HEADERS.Push('x-requested-with');
server.use(restify.CORS());

vous devez utiliser la méthode restify.CORS.ALLOW_HEADERS.Push pour pousser l'en-tête que vous voulez dans restify, puis utilisez le middleware CORS pour démarrer la fonction CORS.

3
Lyman Lai

Cela suffisait dans mon cas:

var server = restify.createServer();
server.use(restify.fullResponse());
server.get('/foo',  respond(req, res, next) {
   res.send('bar');
   next();
});

server.use(restify.CORS());.__ n'était pas nécessaire. De plus, il apparaît que les appels server.use() doivent précéder ceux de server.get() pour fonctionner. 

2
Julian A.

Cela a fonctionné pour moi avec restify 7

server.pre((req, res, next) => {

    res.header('Access-Control-Allow-Origin', req.header('Origin'));
    res.header('Access-Control-Allow-Headers', req.header('Access-Control-Request-Headers'));
    res.header('Access-Control-Allow-Credentials', 'true');
    // other headers go here..

    if(req.method === 'OPTIONS') // if is preflight(OPTIONS) then response status 204(NO CONTENT)
        return res.send(204);

    next();

});
1
vedsmith92
   const cors = require('cors');


   const server = restify.createServer();

   server.use(cors());

Cela a fonctionné pour moi 

0
Harrison Ekpobimi