Spring WebSocket и SockJS c использованием JWT

109
05 марта 2021, 21:20

Есть приложение на Spring boot 2, в котором пользователи авторизуюца и получают access key. Клиентская часть крутится на nodejs. В браузере у пользователя хранится access key. Я хочу после авторизации пользователя соединется с WebSocket и производить обмен/приём сообщениями, но есть проблема в том, что когда подключаюсь к WebSocket, то проверяется наличие в Header кода доступа, который я не знаю как запихать.

Вот как описан WebSocket на сервере

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer
{
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry)
    {
        registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry)
    {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/topic");
    }
}

Контроллер

@Controller
public class ChatController
{
    @MessageMapping("/chat.sendMessage")
    @SendTo("/topic/public")
    public ChatMessage sendMessage(@Payload ChatMessage chatMessage)
    {
        return chatMessage;
    }
    @MessageMapping("/chat.addUser")
    @SendTo("/topic/public")
    public ChatMessage addUser(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor)
    {
        // Add username in web socket session
        headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
        return chatMessage;
    }
}

Клиентская часть

connect() {
      this.socket = new SockJS("http://127.0.0.1:8099/application/ws");
      this.stompClient = Stomp.over(this.socket);
      this.stompClient.connect(
        {
          Authorization: "Bearer " + localStorage.getItem("user-token")
        },
        frame => {
          this.connected = true;
          // eslint-disable-next-line
          console.log(frame);
          this.stompClient.subscribe("/topic/public", tick => {
            // eslint-disable-next-line
            console.log(tick);
            this.received_messages.push(JSON.parse(tick.body).content);
          });
          notificationUtils.methods.showSuccessNotification(
            "Соединение установлено"
          );
        },
        error => {
          // eslint-disable-next-line
          console.log(error);
          notificationUtils.methods.showErrorNotification(
            "Ошибка соединения: " + error.reason
          );
          this.connected = false;
        }
      );
    }

Для работы на клиенте с WebSocket использую sockjs-client и webstomp-client. Пытаюсь добавить Authorization при коннекции, но когда запрос доходит до фильтра прав, то нет в header ключа.

private String getJwtFromRequest(HttpServletRequest request)
    {
        String bearerToken = request.getHeader("Authorization");
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer "))
        {
            return bearerToken.substring(7, bearerToken.length());
        }
        return null;
    }

Если у кого-то были такие же ситуации, посоветуйте как быть. Может есть другие библиотеки на клиент, чтобы можно было добавить ключ в header

Answer 1

Решение описано здесь В кратце, в настройках безопасности надо открыть полный доступ на сокет. В настройках сокета описать дополнить ChannelInterceptor в методе configureClientInboundChannel

READ ALSO
Ad failed to load

Ad failed to load

Не запускается баннер рекламы

94
Node.js Eventloop неожиданное поведение

Node.js Eventloop неожиданное поведение

Если запустить код в консоли то вывод следующий

258
Как скрыть некоторые option у тега select на чистом JS

Как скрыть некоторые option у тега select на чистом JS

У меня есть тег select с тегами option

282
Не могу подключиться к postgresql в react приложении с помощью пакета 'pg' (node-postgres)

Не могу подключиться к postgresql в react приложении с помощью пакета 'pg' (node-postgres)

Задача: подключить БД Postgresql 11 к проекту на React для получения оттуда данныхНе могу найти документацию, соответствующую реальности или примеры...

120