es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se envían los encabezados de autenticación del cliente Stomp java.

Cuando intento enviar encabezados de autenticación a través del cliente Stomp Java FX, no se pasan al backend de Spring Boot.

Cliente:

String URL = 'wss://myurl.de/wsconnection'
WebSocketClient client = new StandartWebSocketClient(client);
WebSocketStompClient stompClient = new WebSocketStompClient(client);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());

StompSessionHandler sessionHandler = new MyStompSessionHandler();
StompHeaders headers = new Headers();
headers.set("Authorization", "Bearer myToken")
headers.setLogin("Bearer myToken")
stompClient.connect(URL, sessionHandler, headers);

He intentado de dos formas: usando el método de encabezado de inicio de sesión y un encabezado de autorización personalizado. Por lo tanto, en el backend, intento obtener un JWT a través de uno de estos dos encabezados. Desafortunadamente, el valor del JWT siempre es nulo, por lo que no se pasa.

Backend:

@Configuration
public class WebSocketSecurityConf extends AbstractSecurityWebSocketMessageBrokerConfigurer {
    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages.anyMessage().permitAll();
    }

    @Override
    protected boolean sameOriginDisabled() {
        return true;
    }
}

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.setInterceptors(new ChannelInterceptorAdapter() {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                    String jwtToken;
                    jwtToken = accessor.getFirstNativeHeader("Authorization");
                    if (jwtToken == null) {
                        jwtToken = accessor.getFirstNativeHeader("login");
                    }

                    System.out.println("El token de WebSocket es " + jwtToken);
                    System.out.println("Encabezado del accesorio " + accessor.getMessageHeaders());

¿Alguna idea aquí?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que los encabezados no se están configurando correctamente en la conexión Stomp. Una posible solución es configurar los encabezados en el método beforeConnect() de la clase MyStompSessionHandler.

    class MyStompSessionHandler extends StompSessionHandlerAdapter {
    
        @Override
        public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
            // ...
        }
    
        @Override
        public void handleTransportError(StompSession session, Throwable exception) {
            // ...
        }
    
        @Override
        public void handleFrame(StompHeaders headers, Object payload) {
            // ...
        }
    
        @Override
        public void beforeConnect(StompHeaders connectHeaders) {
            connectHeaders.set("Authorization", "Bearer myToken");
        }
    }
    

    Esto asegurará que los encabezados se establezcan antes de que se establezca la conexión. Además, asegúrese de que los encabezados correctos se estén leyendo en el backend validando los nombres y valores de los encabezados.

Comments are closed.