Пружинные веб-розетки с JWT - PullRequest
0 голосов
/ 22 апреля 2020

Я реализую связь через websocket между Spring и Angular, используя Stomp. Я не использую сеансовую аутентификацию, но JWT аутентификация. У меня проблема с методом SimpMessagingTemplate.convertAndSendToUser(). Поскольку у меня нет аутентификации на основе сеансов, Spring не знает, как найти способ подключения simpSessionId к логину конечного пользователя. Я пробовал этот https://github.com/spring-projects/spring-framework/blob/master/src/docs/asciidoc/web/websocket.adoc#token -аутентификация добавление Authorization заголовка, но я не могу, так как это Http заголовок, а не websocket. Как я могу подготовить свое внутреннее и внешнее приложение, чтобы включить механизм convertAndSendToUser()? Как передать заголовок Authorization во время установления соединения с веб-сокетом? Я проверил несколько тем на Stackoverflow, но ни одна из них на самом деле не является решением.

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете использовать параметр запроса и добавить его в URL вашего сокета. Затем вам нужно добавить свой JwtAuthorizationFilter, чтобы найти четвертый параметр, если заголовок пуст. Это прекрасно работает для внутреннего приложения, , но я не знаю рисков, добавляющих JWT в URL, вы должны учесть это!

    /**
     * Parses received jwt.
     *
     * @param req Http request from user.
     * @return Authentication token for the user.
     */
    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest req) {
        String token = req.getHeader(HEADER_STRING);
        if (token == null) {
            String[] params = request.getParameterValues("token");
            if(params.length == 1){
                token = TOKEN_TYPE + params[0];
            }
        }


        if (token != null) {
            try {
                // [...]
                }
            } catch (JwtException e) {
                // In case token is expired or invalid. Prevents status 500.
                logger.error(e.getMessage());
                return null;
            }
            return null;
        }
        return null;
    }

На стороне angular Я использовал:

Stomp.client(`${this.url}?token=${this.jwt}`);
...