Ошибка 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 в предполетном ответе.
Пожалуйста, помогите!
Ответы
Ответ 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);