Socket.io: CORS

Criado em 3 fev. 2017  ·  11Comentários  ·  Fonte: socketio/socket.io

hej,

como posso remover o cabeçalho de resposta Access-Control-Allow-Origin ?
parece que as configurações {'origins' : 'asfdasd.com'} não funcionam.

POST /socket.io/?EIO=3&transport=polling&t=1481690658797-5&sid=Dp18NNt_bWPkB4rGAAAP HTTP / 1.1
Origem: https://evilhost.net

HTTP / 1.1 400 Bad Request
Tipo de conteúdo: application / json
Access-Control-Allow-Credentials: verdadeiro
Access-Control-Allow-Origin: https://evilhost.net
Data: Sex, 03 de fevereiro de 2017 12:27:42 GMT
Conexão: keep-alive
Transfer-Encoding: chunked

Comentários muito úteis

@thEpisode Sei que este é um tópico antigo, mas foi o link final que consertou para mim! A maioria dos tutoriais Express tem app.listen(...) mas no caso de usar socket.io você precisa ter certeza de que em seu index.js você chamará http.listen(...) e NÃO ouvirá o objeto app , ou você obterá este problema CORS. Uma coisa tão pequena!

Todos 11 comentários

Mesmo erro

@Kenzku @thEpisode Qual versão do socket.io você está usando?

Deve ser corrigido em 2.x (que inclui https://github.com/socketio/engine.io/pull/452).

Olá @darrachequesne, obrigado pela resposta. Eu sou o criador do Crawler Site (https://www.crawlersite.com) e usamos Socket.io para enviar dados aos nossos servidores e toda a nossa infraestrutura está no Microsoft Azure, todos os testadores e primeiros testadores beta usam o Azure e nós ainda não não há problemas, mas um novo betatester usa outro provedor de serviços em nuvem e relatou um bug. O problema é CORS, lemos todas as perguntas no Google !! e buscando soluções notamos que Socket.io está atualizado para 2.0 (exatamente 2.0.1 no servidor), atualizamos cliente e servidor mas o problema persiste, usamos o Express que também relatou problemas com CORS e resolvemos.

Estamos muito frustrados porque todas as soluções do Google não resolveram o problema, desculpe por não postar isso no GitHub ou StackOverflow, mas queremos dar todos os detalhes possíveis para resolvê-lo. Alguns URLs para testar:

URI de back-end: http://crawlerbackend.azurewebsites.net
Testando Express CORS: https://testcors.000webhostapp.com (esta hospedagem é usada pelo testador)
Testando Socket.io CORS: https://testcrawlersite.000webhostapp.com (consulte o console)
Nosso site principal para testar: http://crawler-test.azurewebsites.net (com novas modificações também está quebrado)
Arquivo Socket.io: http://crawlerbackend.azurewebsites.net/socket.io.js

Parte do nosso app.js:
`
var path = require ('path');
var bodyParser = require ('body-parser');
var cors = requer ('cors');
var express = require ('express');
var app = express ();

// use body parser so we can get info from POST and/or URL parameters
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies
app.use(bodyParser.json()); // support json encoded bodies
app.use(cors({ origin: '*' }));
// Settings for CORS
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.header('Access-Control-Allow-Origin', '*');

    // Request methods you wish to allow
    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.header('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', false);

    // Pass to next layer of middleware
    next();
});

var server = app.listen(cross.NormalizePort(process.env.PORT || 3500));
var io = require('socket.io').listen(server, {
    log: false,
    agent: false,
    origins: '*:*',
    transports: ['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling', 'polling']
});

`

Problema resolvido!! @Kenzku , analise esta documentação: https://github.com/socketio/socket.io/blob/master/docs/API.md#serveroriginsvalue e veja o código: https://github.com/socketio/socket.io /blob/master/lib/index.js#L67 e verifique se você usa Express (este exemplo é muito útil): https://github.com/socketio/socket.io#in -conjunction-with-express

Excelente! Acho que podemos encerrar o problema agora.

@thEpisode Sei que este é um tópico antigo, mas foi o link final que consertou para mim! A maioria dos tutoriais Express tem app.listen(...) mas no caso de usar socket.io você precisa ter certeza de que em seu index.js você chamará http.listen(...) e NÃO ouvirá o objeto app , ou você obterá este problema CORS. Uma coisa tão pequena!

@frewinchristopher estou seguindo o mesmo padrão que você mencionou acima, localmente está funcionando bem, mas em controle remoto ele dispara (Motivo: a solicitação CORS não foi bem-sucedida). onde estou errado ..?

@gowthamyaal você poderia nos mostrar seu código?

Obrigado por sua preocupação, mas resolveu o problema CORS, como eu estava usando AWS há um conflito com ip elástico e ip local, depois eu mudei o ip de escuta do soquete para 0.0.0.0, isso resolveu meu problema.

Agora, enfrentando o problema de condição de corrida no controle remoto, estou usando o webpack-dev-config, tentei usar o io conectar e emitir código no mesmo arquivo, mas acabei com um erro indefinido

webpack-dev-config

código de soquete do cliente
;)

as linhas comentadas funcionaram para mim .... alguém poderia me ajudar com isso .... obrigado antecipadamente

Segui todas as soluções que pude encontrar e ainda não enviei uma resposta funcional. Se alguém pudesse dar uma olhada eu ficaria muito grato.

`const express = require ('express')
const http = require ('http')
const socketIO = require ('socket.io')
const cors = require ('cors')

// Porta do host
porta const = 3001

const app = express ()
app.use (cors ())
// Instância do servidor
const server = http.createServer (app)
// Cria soquete usando a instância do servidor
const io = socketIO (servidor)

io.origins ("http: // localhost: 3000")

io.on ('conexão', soquete => {
console.log ("Usuário conectado")

socket.on('disconnect', () => {
    console.log("User Disconnected")
})

socket.on('send message', (message) => {
    io.sockets.emit('send message', message)
})

})

server.listen (port, () => console.log ( Listening on port ${port} )) `

Esta página foi útil?
0 / 5 - 0 avaliações