Браузер не отправлет cookie с jsessionid при handshake запросе для wwebsocket соединения
Есть бэк (rest api) на Spring Framework с использованием Spring Security.
Аутентификация пользователей настроена на использование сессий и jsessionid в cookies.
Есть фронт на React.
Запрсы через http/https работают отлично.
Но при попытке соединения с websocket возникает ошибка.
Endpoint /ws для handshake запроса защищен и требует аутентифицированного пользователя (authenticated), но браузер не отправляет cookie с jsessionid.
Настройки WebSocket на бэке:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("http://localhost:8080", "http://localhost:3000");
}
}
jsx файл на фронте:
import { Client } from '@stomp/stompjs';
import { useEffect } from 'react';
import styles from './chatRoom.module.scss';
import { useNavigate } from 'react-router-dom';
import Button from '../../components/Button/Button';
const Chat = () => {
const navigate = useNavigate();
const client = new Client({
brokerURL: 'ws://localhost:8080/ws',
onConnect: () => {
client.subscribe('/topic/test01', message =>
console.log(`Received: ${message.body}`)
);
client.publish({ destination: '/topic/test01', body: 'First Message' });
},
});
useEffect(() => {
client.activate();
}, []);
const backToMyChatsPageAndDisconectChat = () => {
client.deactivate();
navigate('/myChats');
};
return (
<div className={styles.positionButton}>
<Button className={styles.button} click={backToMyChatsPageAndDisconectChat} name={'НАЗАД В МОИ ЧАТЫ'}/>
</div>
)
};
export default Chat;
Подскажите, пожалуйста, в чем может быть проблема?
Дополнение: вопрос отностися к начальному handshake(upgrade) запросу.
Ответы (1 шт):
У ws нет кук. Есть, конечно началиныйй http запрос, на который сервер должен сделать Connection: upgrade и превратить его в ws соединение, но с браузера куку при установлении запроса ws не отправить. Вам необходимо изменить сервер и клиент и передавать куку как сообщение внутри websocket после установки соединения