Как включить заголовок разрешения происхождения в CORS на экспресс-сервере с помощью swagger-ui - PullRequest
0 голосов
/ 04 апреля 2019

Мой сервер API не изменяет и не перезаписывает заголовок Access-Control-Allow-Origin.

У меня есть приложение Angular 2+ с API Express / Swagger-UI.

Заголовок Access-Control-Allow-Origin в API не может быть «*», потому что я использую «withCredentials» в моих запросах, и он вызывает ошибку в браузере.

Я использовал 'cors' для установки заголовков CORS. Как это:

'use strict';

var configuration = require('./configuration');
var SwaggerExpress = require('swagger-express-mw');
var app = require('express')();
var mongoose = require('mongoose');
var bluebird = require('bluebird');
var bodyParser = require('body-parser');
var jwt = require('jsonwebtoken');
var compression = require('compression');
var cors = require('cors');

app.use(bodyParser.json({ limit: '50mb' }));
app.use(compression());

SwaggerExpress.create(config, function(err, swaggerExpress) {
  if (err) { throw err; }

  swaggerExpress.register(app);
  var port = process.env.PORT || 10010;
  mongoose.Promise = bluebird;
  mongoose.connect(appConfig.dbConection());
  mongoose.connection.on('error', console.error.bind(console, 'connection error: '));
  mongoose.set('debug', true);
  mongoose.connection.once('open', function() {
    app.listen(port);
  })
});
const swaggerUi = require('swagger-ui-express');
const YAML = require('yamljs');
const swaggerDocument = YAML.load('./api/swagger/swagger.yaml');

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
var allowedOrigins = ['http://localhost:4200', 'http://127.0.0.1:10010'];
app.use(cors({
    origin: (origin, callback) => {
        if (!origin) return callback(null, true);
        if (allowedOrigins.indexOf(origin) === -1) {
            return callback(new Error('The CORS policy for this site does not allow the specified Origin'), false);
        }
        return callback(null, true);
    },
    exposedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization', 'api_key', 'x-api-key'],
    credentials: true
}));

Access-Control-Allow-Origin должен соответствовать массиву разрешенных хостов.

Когда я вызываю API из браузера, он сначала делает запрос OPTIONS, который выглядит правильно, например:

Request URL: http://localhost:10010/v1/loginApp
Request Method: OPTIONS
Status Code: 204 No Content
Remote Address: [::1]:10010
Referrer Policy: no-referrer-when-downgrade

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: x-api-key
Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE
Access-Control-Allow-Origin: http://localhost:4200
Access-Control-Expose-Headers: Origin,X-Requested-With,Content-Type,Accept,Authorization,api_key,x-api-key
Connection: keep-alive
Content-Length: 0
Date: Thu, 04 Apr 2019 08:25:53 GMT
Vary: Origin, Access-Control-Request-Headers
X-Powered-By: Express

Но затем он делает запрос GET / POST, а затем снова имеет заголовки по умолчанию:

Request URL: http://localhost:10010/v1/loginApp
Request Method: GET
Status Code: 200 OK
Remote Address: [::1]:10010
Referrer Policy: no-referrer-when-downgrade

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Origin,X-Requested-With,Content-Type,Accept,Authorization,api_key,x-api-key
Content-Length: 770
Content-Type: application/json; charset=utf-8
Date: Thu, 04 Apr 2019 08:25:53 GMT
ETag: W/"302-BwX5DjK/lUY+ueP6UZ9TgWOTw/s"
Vary: Origin
X-Powered-By: Express

Я думаю, что-то (вероятно, swagger-UI) перезаписывает мою конфигурацию заголовков, но я не могу понять это.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Кажется, что swagger-express-mw поставляется со встроенной поддержкой CORS, см. swagger_controllers в вашем config/default.yaml. У меня была та же проблема, и я исправил ее, удалив оттуда cors.


Как и вы, я подозреваю, что он перезаписывает заголовок Access-Control-Allow-Origin, но у него не было времени проверить его правильно.

0 голосов
/ 04 апреля 2019

Вам необходимо зарегистрировать свое промежуточное программное обеспечение CORS до обработчиков Swagger GET / POST.

Запрос OPTIONS выполняется успешно, поскольку Swagger не регистрирует обработчик OPTIONS, поэтому запрос достигаетпромежуточное ПО.

Сбой запросов GET / POST до того, как обработчики Swagger примут запрос до того, как он достигнет промежуточного ПО CORS.

Перемещение app.use(cors({..., поэтому до app.use('/api-docs', swaggerUi....

...