Ответ предполетной проверки CORS не соответствует фактическому ответу - PullRequest
5 голосов
/ 20 марта 2019

На моем сервере node.js я включил CORS в качестве промежуточного программного обеспечения, например, так:

app.use(cors({ origin: 'http://<CORRECT_ORIGIN_URL>:3030', credentials: true }))

Я использую клиент Apollo в приложении, которое отправляет запрос, и установил учетные данные для «включения», когдаинициализация ApolloClient, например, так:

// Create a WebSocket link
const wsLink = process.browser ? new WebSocketLink({
    uri: `ws://<CORRECT_REQUEST_URL>:8000/graphql`,
    options: {
        reconnect: true,
    },
}) : null

// Create an http link (use batch, allow cookies response from server)
const httpLink = new BatchHttpLink({
    uri: 'http://<CORRECT_REQUEST_URL>/api/',
    credentials: 'include'
})


// Split terminating link for websocket and http requests
const terminatingLink = process.browser ? split(
    ({ query }) => {
        const { kind, operation } = getMainDefinition(query)
        return kind === 'OperationDefinition' && operation === 'subscription'
    },
    wsLink,
    httpLink,
) : httpLink

// Create Apollo client
const client = new ApolloClient({
    link: ApolloLink.from([authLink, errorLink, terminatingLink])
})

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

ЗапросЗаголовки (запрос OPTIONS)

Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Origin: http://<CORRECT_ORIGIN_URL>:3030
Referer: http://<CORRECT_ORIGIN_URL>/login

Заголовки ответа (запрос OPTIONS)

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE
Access-Control-Allow-Origin: http://<CORRECT_ORIGIN_URL>:3030
Connection: keep-alive
Content-Length: 0
Date: Wed, 20 Mar 2019 03:09:14 GMT
Server: nginx/1.15.5 (Ubuntu)
Vary: Origin, Access-Control-Request-Headers
X-Powered-By: Express

Тем не менее, когда отправляется фактический запрос POST, я получаюследующий ответ:

Заголовки ответа (POST-запрос)

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Encoding: gzip
Content-Type: application/json
Date: Wed, 20 Mar 2019 03:09:15 GMT
Server: nginx/1.15.5 (Ubuntu)
Transfer-Encoding: chunked
Vary: Accept-Encoding, Origin
X-Powered-By: Express

Я понятия не имею, почему заголовки ответа различаются в запросе на публикацию, когда предварительная проверка параметров показывает, чтоэто должно быть правильно.

Этот неправильный ответ POST приводит к следующему сообщению об ошибке на клиенте:

Access to fetch at 'http://<CORRECT_REQUEST_URL/api/' from origin
'http://<CORRECT_ORIGIN_URL>:3030' has been blocked by CORS policy: 
The value of the 'Access-Control-Allow-Origin' header in the response 
must not be the wildcard '*' when the request's credentials mode is
'include'.

Я пробовал поискать и искать в стеке поток решения, но не могу найтичто-нибудь.Есть идеи?

Ответы [ 2 ]

3 голосов
/ 25 марта 2019

ОК, я понял это ... Сервер Apollo переопределяет настройки cors.Добавление 'cors: false' в .applyMiddleware удаляет переопределение.См. https://www.apollographql.com/docs/apollo-server/api/apollo-server.html#Parameters-2 и https://github.com/expressjs/cors/issues/134#issuecomment-413543241 для получения более подробной информации

0 голосов
/ 20 марта 2019

У меня были похожие проблемы с прокси-сервером apache2, запущенным перед моими службами Express.Прокси-сервер кешировал некоторые (только некоторые!) Ответы.Это то, что я добавил в конфигурацию apache, и это решило проблему:

Header set Cache-Control "no-cache, must-revalidate"    env=no-cache-headers
Header set Pragma        "no-cache"                     env=no-cache-headers
Header set Expires       "Sat, 1 Jan 2000 00:00:00 GMT" env=no-cache-headers
...