Проверка CORS для WEB Socket - PullRequest
1 голос
/ 10 января 2020

Я использую expressjs и добавил проверку cors для всех источников.

const options = {


 origin: ['*'],
  credentials: true,
  exposedHeaders: false,
  preflightContinue: false,
  optionsSuccessStatus: 204,
  methods: ['GET', 'POST'],
  allowedHeaders: allowedHeaders,
};

module.exports = cors(options);

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

Я использую angular наблюдаемый, чтобы получить ответ как.

    const headers = {
      // Host: '',
    };
    return this.http.get(`${environment.BASE_URL}:${_port}`,
 { headers, observe: 'response' });
  }

Запрос, который не является сокетом, отправляет правильный ответ. Однако тот, у которого есть сокет, посылает мне другой объект.

Но я также получаю правильный ответ от сокета, если я просматриваю вкладку сети.

См. Скриншоты ниже.

https://prnt.sc/qlq9up (недействительный CORS)

https://prnt.sc/qlqd88 (заголовок ответа на вкладке сети)

Этот заголовок можно получить, если включить расширение CORSe в моем браузере Firefox.

EDIT : Я не использую Socket.io, а скорее веб-сокет websocket = require('ws');


ОТВЕТ : Моя проблема была логической ошибкой.

Это не совсем то, что решило мою проблему, потому что я использовал websocket, а не socket.io, однако, это заставило меня осознать свою проблему, я отдельно слушал websocket и https и смог исправить это, как только я добавлена ​​опция использования cors в websocket

1 Ответ

1 голос
/ 10 января 2020

мой пример, который работает, сокет для другого сервера

// socket.js server config,for express

const app = express();
const server = app.listen(process.env.SOCKET_PORT, function () {
    console.log("Server started: http://localhost:" + process.env.SOCKET_PORT + "/");
});

app.use(function (req, res, next) {
    res.setHeader(
        "Access-Control-Allow-Headers",
        "X-Access-Token, Content-Type, Lang, crossDomain"
    );
    res.setHeader(
        "Access-Control-Allow-Methods",
        "POST, GET, OPTIONS, PUT, DELETE"
    );
    res.setHeader("Access-Control-Allow-Origin", "*");
    req.headers.host = req.headers["x-forwarded-host"];
    res.setHeader("Cache-Control", "no-cache");

    //intercepts OPTIONS method
    if ('OPTIONS' === req.method) {
        //respond with 200
        res.sendStatus(200);
    } else {
        //move on
        next();
    }
});

const io = require('socket.io')(server, {
    transports: [
        // 'polling',
        "websocket"
    ],
    allowUpgrades: true,
    adapter: redisAdapter({host: 'localhost', port: process.env.REDIS_PORT || '6379'}),
    pingInterval: 3000,
    wsEngine: 'ws'
})

также у меня есть config внутри nginx .conf

 location / {
// important line

        proxy_set_header 'Access-Control-Allow-Origin' '*';
        proxy_set_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

  # redirect all traffic to local port;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_redirect off;
        proxy_read_timeout 86400;

        # prevents 502 bad gateway error
        proxy_buffers 8 32k;
        proxy_buffer_size 64k;

        reset_timedout_connection on;


//your port here
        proxy_pass http://localhost:YOUR_PORT;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...