Как аутентифицировать чат websocket с помощью JWT - PullRequest
0 голосов
/ 19 июня 2020

У меня есть функциональный проект чата через веб-сокеты, который уже работает, теперь мне нужно реализовать аутентификацию через JWT. Это поток запросов

  1. Клиент подключается к ws://localhost:port/chatting
  2. Клиент подписывается на свой собственный почтовый ящик, чтобы получать сообщения от других клиентов: /user/{userId}/queue/chatting
  3. Клиент может отправлять сообщения другим пользователям в / app / message, указав в теле: { 'message': msg, 'from': "userId", 'to': "recipientId" }, и система перенаправит их на /user/{recipientId}/queue/chatting

Я хотел бы защитить:

  1. Пользователь должен пройти аутентификацию, чтобы выполнить рукопожатие
  2. Пользователь должен иметь «userId», чтобы подписаться на / user / "userId" / queue / chatting, чтобы другие пользователи не могли получить к нему доступ.
  3. Пользователь должен быть «userId», чтобы отправить сообщение другому пользователю с "userId" в from внутри тела

1 Ответ

1 голос
/ 20 июня 2020

Прежде всего, можно добавить аутентификацию, настроив то же самое в WebSecurityConfig, добавив собственный JwtRequestFilter, который будет анализировать ваш токен JWT и устанавливать контекст аутентификации для этого запроса.

A хорошая ссылка на то же самое: create-apis-with-jwt-authorization-using-spring-boot .

Что касается 2 и 3, Springboot не позволяет открывать конечные точки Dynami c для Регистрация STOMP, поэтому вам нужно будет предоставить /user/queue/chatting, и клиенты должны будут подписаться на это напрямую. Однако, используя convertAndSendToUser (userId, destination, payload) , вы можете отправить сообщение на основе userId. Эта функция внутренне вызывает эту функцию , которая делает это this.destinationPrefix(/user) + user(/username) + destination(/queue/chatting), так как вы можете видеть, что переменная user получает префикс для конечного пункта назначения, вы можете передать userId вместо userName.

Ссылка для этого: simpMessagingTemplate.convertAndSendToUser

Но учтите, что в этом случае вам нужно будет установить имя пользователя для этого сеанса как сам userId. Это можно сделать в вашем пользовательском JwtRequestFilter

private void populateSecurityContextHolder(HttpServletRequest request, String userId, List<SimpleGrantedAuthority> grantedAuthorities) {
        PreAuthenticatedAuthenticationToken authToken = new PreAuthenticatedAuthenticationToken(
                userId, null, grantedAuthorities);
        authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
        SecurityContextHolder.getContext().setAuthentication(authToken);
        log.info("Authentication set for userId " + userId);
    }

Таким образом, ваш сервер может отправлять сообщения на основе userId, который он получает в сообщениях.

...