Конфигурация CORS с Restify

Я вижу, что заголовок access-control-allow-origin по умолчанию устанавливается на подстановочный знак всякий раз, когда я выполняю HTTP GET для моей службы Restify с включенной CORS. Я бы предпочел, чтобы он повторял отправленное мной Origin, поскольку это лучшая практика для OWASP . Какие-нибудь рекомендации, как я могу это сделать? Пробовал заголовки по умолчанию, средства форматирования и т. Д., Которые есть в документации API, но не повезло.

Вот что я делаю:

    var server = restify.createServer({
        name: 'People Data Service',
        version: '1.0.6'
    });        
        server.pre(wrapper(restify.pre.pause()));
        // Cleans up sloppy paths
        server.pre(wrapper(restify.pre.sanitizePath()));
        server.use(wrapper(restify.acceptParser(server.acceptable)));
        server.use(wrapper(restify.authorizationParser()));
        server.use(wrapper(restify.queryParser()));
        server.use(wrapper(restify.bodyParser()));
        server.use(wrapper(restify.CORS()));
    //    server.use(wrapper(restify.fullResponse()));

        // Needed this for OPTIONS preflight request: https://github.com/mcavage/node-restify/issues/284
        function unknownMethodHandler(req, res) {
            if (req.method.toUpperCase() === 'OPTIONS') {
                console.log('Received an options method request from: ' + req.headers.origin);
                var allowHeaders = ['Accept', 'Accept-Version', 'Content-Type', 'Api-Version', 'Origin', 'X-Requested-With', 'Authorization'];

                if (res.methods.indexOf('OPTIONS') === -1) {
                    res.methods.push('OPTIONS');
                }

                res.header('Access-Control-Allow-Credentials', false);
                res.header('Access-Control-Expose-Headers', 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);
                res.header('Access-Control-Max-Age', 1209600);

                return res.send(204);
            }
            else {
                return res.send(new restify.MethodNotAllowedError());
            }
        }
    server.on('MethodNotAllowed', wrapper(unknownMethodHandler));

person occasl    schedule 17.09.2013    source источник


Ответы (3)


Я делаю это так в моем базовом приложении 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());

вам нужно использовать метод restify.CORS.ALLOW_HEADERS.push, чтобы сначала отправить желаемый заголовок в restify, а затем использовать промежуточное ПО CORS для загрузки функции CORS.

person Lyman Lai    schedule 26.09.2013
comment
Это только позволяет заголовки; это не приведет к тому, что Access-control-allow-origin будет отображать заголовок запроса origin. Я открыл кейс на Github, чтобы посмотреть, можно ли это добавить. github.com/mcavage/node-restify/issues/446 - person occasl; 28.09.2013
comment
@occasl кажется, что по умолчанию он установлен на * при вызове restify.CORS () - person Lyman Lai; 06.10.2013
comment
Да, это правильно. Вы должны обновить источник в соответствии с моим ответом, чтобы он установил происхождение. Я отправил запрос на перенос владельцу. - person occasl; 07.10.2013

Я нашел способ сделать это, внеся простую модификацию файла cors.js в Restify следующим образом:

Index: node_modules/restify/lib/plugins/cors.js
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- node_modules/restify/lib/plugins/cors.js    (revision )
+++ node_modules/restify/lib/plugins/cors.js    (revision )
@@ -102,6 +102,7 @@
                                 res.setHeader(AC_ALLOW_ORIGIN, origin);
                                 res.setHeader(AC_ALLOW_CREDS, 'true');
                         } else {
+                            origin = req.headers['origin'];
                                 res.setHeader(AC_ALLOW_ORIGIN, origin);
                         }

Это добавит источник в заголовок ответа, даже если для учетных данных установлено значение false. Кроме того, если вы хотите внести свое происхождение в белый список, вы можете просто добавить это в свою конфигурацию:

server.use(restify.CORS({'origins': ['http://localhost', 'https://domain.my.com', 'https://anotherDomain.my.com']}));
person occasl    schedule 02.10.2013
comment
Я думаю, вы можете просто оставить атрибут origin пустым, если хотите установить его на '*', основываясь на том, что я вижу в файле подключаемого модуля cors: var origins = opts.origins || ['*']; - person thataustin; 10.03.2014
comment
Они недавно приняли мой запрос на перенос, поэтому я думаю, что это должно быть в последнюю очередь. - person occasl; 11.03.2014

Это действительно просто.

Вам необходимо запустить сервер, прежде чем вы сможете его настроить!

var server = restify.createServer (...);

Чтобы настроить CORS, выполните следующие действия:

1. вам нужно указать ALLOW_HEADERS

Это массив заголовков, используемых для установки, если поступил запрос CORS.

2. настроить CORS-плагин

server.use (restify.CORS ({учетные данные: истина}));

параметр «учетные данные» будет использоваться плагином restif-CORS для добавления Access-Control-Allow-Credentials и Access-Control-Allow-Origin.

На стороне клиента важно использовать withCredentials = true для xhr-транспорта.

Надеюсь, этот ответ вам поможет.

... пишите код и получайте удовольствие!

person drdrej    schedule 23.11.2015