Подтвердить что ты не робот

Ошибка CORS: поле заголовка запроса. Авторизация не разрешена заголовками Access-Control-Allow-Headers в предполетном ответе

Я пытаюсь отправить запрос с одного порта localhost на другой. Я использую angularjs на интерфейсе и node на бэкэнд.

Поскольку это запрос CORS, в node.js, я использую

res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');

и в файле службы angular.js, я использую

return {
    getValues: $resource(endpoint + '/admin/getvalues', null, {
        'get': {
             method: 'GET',
             headers:{'Authorization':'Bearer'+' '+ $localStorage.token}
             }
     }),
}

Я получаю следующую ошибку

Поле заголовка запроса Авторизация не разрешена заголовками Access-Control-Allow-Headers в предполетном ответе.

Пожалуйста, помогите!

4b9b3361

Ответ 1

Вы должны добавить опции также в разрешенных заголовках. браузер отправляет предварительный запрос перед отправкой исходного запроса. Увидеть ниже

 res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');

Из источника https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS

В CORS отправляется предварительный запрос с методом OPTIONS, так что сервер может ответить, допустимо ли отправить запрос с этими параметрами. Заголовок Access-Control-Request-Method уведомляет сервер как часть предварительного запроса о том, что при отправке фактического запроса он будет отправлен методом запроса POST. Access-Control-Request-Headers уведомляет сервер о том, что при отправке фактического запроса он будет отправлен с пользовательскими заголовками X-PINGOTHER и Content-Type. Теперь у сервера есть возможность определить, хочет ли он принять запрос в этих обстоятельствах.

РЕДАКТИРОВАНИЕ

Вы можете избежать этой ручной настройки, используя npmjs.com/package/cors npm package. Я также использовал этот метод, он понятен и прост.

Ответ 2

Это проблема API, вы не получите эту ошибку, если используете Postman/Fielder для отправки HTTP-запросов в API. В случае браузеров, для обеспечения безопасности, они всегда отправляют запрос OPTIONS/preflight в API перед отправкой фактических запросов (GET/POST/PUT/DELETE). Поэтому в случае, если метод запроса является OPTION, вам нужно не только добавить "Авторизация" в "Access-Control-Allow-Headers", но вам нужно добавить "OPTIONS" в "Access-Control-allow-methods" как Что ж. Так я исправил:

if (context.Request.Method == "OPTIONS")
        {
            context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { (string)context.Request.Headers["Origin"] });
            context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept, Authorization" });
            context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" });
            context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });

        }

Ответ 3

res.header('Access-Control-Allow-Origin', '*'); не будет работать с заголовком авторизации. Просто включите предполетный запрос, используя библиотеку cors:

var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
app.options('*', cors())

Ответ 4

Для тех, кто получает это с помощью ServiceStack backend; добавьте "Authorization" к разрешенным заголовкам в плагине Cors:

Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type,Authorization"));

Ответ 5

Если вы не хотите устанавливать библиотеку cors и вместо этого хотите исправить свой исходный код, другой, который вам не хватает, это то, что Access-Control-Allow-Origin: * неверен. При передаче токенов аутентификации (например, JWT) вы должны явно указать каждый URL-адрес, который вызывает ваш сервер. Вы не можете использовать "*" при выполнении токенов аутентификации.

Ответ 6

Сначала вам нужно установить cors с помощью следующей команды:

npm install cors --save

Теперь добавьте следующий код в начальный файл вашего приложения, например (app.js or server.js)

var express = require('express');
var app = express();

var cors = require('cors');
var bodyParser = require('body-parser');

//enables cors
app.use(cors({
  'allowedHeaders': ['sessionId', 'Content-Type'],
  'exposedHeaders': ['sessionId'],
  'origin': '*',
  'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
  'preflightContinue': false
}));

require('./router/index')(app);