2014-10-22 3 views
1

У нас есть реализация на стороне сервера websocket с использованием весны 4. Она была настроена на использование весенней безопасности для auth/authz. На стороне клиента мы используем sockJS, который отлично работает, когда клиент находится в том же домене, что и сервер.SockJS не передает учетную информацию в другом домене (CORS)

Позвони WebSocket производится таким образом ...

гнездо = ​​новый SockJS ("http://guest:[email protected]/MyWebSocketApp/tracker")

В конечном итоге это делает вызов http://guest:[email protected]/MyWebSocketApp/tracker/info решить транспортный использовать. Все это хорошо.

Однако при использовании клиента из другого домена я вижу, что учетные данные удаляются. Таким образом, когда этот клиент находится в другом домене, я вижу, что сделанный звонок: http://myinterestingdomain.com/MyWebSocketApp/tracker/info. Я не вижу, как передаются учетные данные. Из-за этого я получаю ошибку 401 (несанкционированный). Мы имеем конфигурацию CORS на стороне сервера, а также:

Access-Control-Allow-Credentials «истинный»

Может кто-то пожалуйста, помогите мне, я из вариантов, и я не понимаю, почему? учетные данные становятся раздели? может ли это быть связано с CORS?

ответ

3

Даже если XmlHttpRequest.withCredentials=true (сделано клиентом SockJS) и Access-Control-Allow-Credentials=true, вы не можете передать имя пользователя и пароль в URL для запросов кросс-доменов.

Чтобы использовать базовую аутентификацию, вам необходимо создать Authorization, но, похоже, клиент SockJS этого не разрешает. Существует проблема с такой поддержкой, я добавил a new comment, объясняя, что это необходимо для поддержки базовой аутентификации.

Поскольку заголовок авторизации не является simple header, перед фактическим запросом будет отправлено сообщение CORS preflight request. Но Spring Framework в настоящее время does not dispatch OPTIONS requests по умолчанию, поэтому даже с заголовком Authorization, установленным на стороне клиента, вам также потребуется включить запросы OPTIONS, отправляемые в Spring Framework.

С web.xml:

<servlet> 
<servlet-name>dispatcherServlet</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<init-param> 
    <param-name>dispatchOptionsRequest</param-name> 
    <param-value>true</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 

Или, если вы используете Servlet 3 без web.xml, добавьте это в свой класс, расширяющий AbstractAnnotationConfigDispatcherServletInitializer:

@Override 
protected void customizeRegistration(Dynamic registration) { 
    registration.setInitParameter("dispatchOptionsRequest", "true"); 
} 
+0

Большое спасибо за предоставление предложения , Он многое разъясняет. Таким образом, похоже, что для завершения работы в конце концов нам придется ждать исправления от сообщества SockJS. Правильно ли я понимаю? Между тем, мы решили использовать «чистую» поддержку Spring's Spring. Это означает удаление метода .withSockJS() из приложения WebSocketConfigurer. Мы проверили, что он отлично работает при использовании чистых веб-узлов на основе Java. Существует ли обходное решение для клиентов браузера (с использованием чистой websocket JS) для передачи учетных данных в домене? – myspri

 Смежные вопросы

  • Нет связанных вопросов^_^