Я пытаюсь сделать запрос REST на сервере Wildfly. Сначала я должен войти в старое приложение и получить cookie. Этот файл cookie должен использоваться в более новом приложении, которое делает запросы REST. Новое приложение представляет собой шаблон из реального существующего. Я пробовал некоторые параметры в заголовке запроса REST, например, задавать свойства withCredentials, Access-Control-Allow-Credentials, токен, crossDomain, как показано в функции getAllEntities ниже.
Запросы REST, где протестированы, и они отлично работали с RestClient в браузере Firefox, как показано ниже.
Я не знаю как:
вставить cookie, который я получаю из предыдущего приложения
удалить токен (кажется, это невозможно)
решить эти две ошибки, которые написаны в заголовке
Вот как выглядит запрос в RestClient:
Method: GET
URL: https://xx.xx.xx.xx:8443/api/codes
Content-Type: application/json
Accept: application/json
Cookie: code_system_frontend=bvkkvbcp24igdgja4h5hht13p4; code=ae8be9267e8dfea86a8f54f6bd980733
Вот как выглядит реакция в RestClient:
Status Code: 200 OK
Access-Control-Allow-Headers: Content-Type, Content-Disposition, Accept, responseType, X-MAC, X-TIME, Cookie
Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Content-Type, Content-Disposition, Accept
Connection: keep-alive
Content-Type: application/json
Date: Tue, 26 Jul 2016 15:22:00 GMT
Server: WildFly/9
Transfer-Encoding: chunked
access-control-allow-credentials: true
x-powered-by: Undertow/1
и типичный корпус ответа JSON:
[
{
"code": 1,
"codename": "Demo"
},
{
"code": 2,
"codename": "Gmx"
}
//AND SO ON
]
Это код в Angularjs:
function getAllEntities(entityName, addToCache) {
config = {
headers: {
'cookie':'code_system_frontend=bvkkvbcp24igdgja4h5hht13p4;code=ae8be9267e8dfea86a8f54f6bd980733',
'Content-Type': 'application/json',
'Accept': 'application/json',
'withCredentials':'true',
//'Access-Control-Allow-Credentials': 'true',
//'X-API-TOKEN': undefined,
//'token':undefined,
//crossDomain: true
},
data: ''
};
return $http.get(endPoints.api + entityName, config)
.then(getAllEntitiesComplete)
.catch(function (message) {
exception.catcher('XHR Failed for getAllEntities for entity ' + entityName)(message);
return $q.reject(message);
logger.info('Message ' + message);
});
function getAllEntitiesComplete(data, status, headers, config) {
var entities = data.data;
if (addToCache) {
service.cachedLookups[entityName] = entities;
service[entityName + 's'] = entities;
}
return entities;
}
}
В Firebug я получаю:
Заголовок запроса в Firebug:
Accept: application/json
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.5
Content-Type: application/json
Host: XX.XX.XX.XX:8443
Origin http://admin.dev.xxxxxxxx.xxx
Referer http://admin.dev.xxxxxxxx.xxx/xx/codes
User-Agent Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
token fake token for anonymous user
withCredentials true
И я также получаю предупреждение в Firebug:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the
remote resource at https://xx.xx.xx.xx:8443/xxxxxxxx/api/code. (Reason:
CORS header 'Access-Control-Allow-Origin' does not match '*').
И я получаю эту ошибку из-за моего кода:
Error: XHR Failed for getAllEntities for entity suborder Object { status=0, config={...}, data=null, more...}
В Crome я получаю:
Refused to set unsafe header "cookie"
а также
net::ERR_INSECURE_RESPONSE
Запрос на перекрестный запрос заблокирован: политика одинакового происхождения запрещает чтение удаленного ресурса по адресу https://xx.xx.xx.xx: 8443/xxxxxxxx/api/code. (Причина: заголовок CORS "Access-Control-Allow-Origin" не соответствует "*").
Похоже, что вы не включили Cross Origin Resource Sharing (CORS) на свой сервер или неправильно настроили его.
Что касается проблемы с заголовком, вы должны посмотреть на этот пост:
Ошибка сообщения AJAX: отказ от установки небезопасного заголовка "Соединение"
XMLHttpRequest не разрешено устанавливать эти заголовки, они автоматически устанавливаются браузером. Причина в том, что, манипулируя этими заголовками, вы можете обмануть сервер в принятии второго запроса через одно и то же соединение, которое не будет проходить обычные проверки безопасности - это будет уязвимость безопасности в браузере.
Если вы используете файлы cookie, cookie должен автоматически отправляться с каждым запросом, особенно если вы установили withCredentials = true.
Однако, если вы используете токены, вы должны добавить их в заголовок авторизации, как правило, в формате: "Bearer" + mytoken