L'en-tête de la réponse ne doit pas être le caractère générique '*' lors de la demande d'informations d'identification du mode "inclure"

Je suis en utilisant Auth0 pour mon authentification de l'utilisateur pour autoriser uniquement les utilisateurs enregistrés d'accéder à un Ressort (Boot) RestController. À ce point, je suis de créer en temps réel une fonctionnalité de message, où les utilisateurs peuvent envoyer des messages à partir de la Angular 2 client (localhost:4200) pour le Printemps serveur (localhost:8081) à l'aide de stompjs et sockjs.

Lorsque vous essayez de créer un Stomp-client et le démarrage d'une connexion j'ai le message suivant dans la console d'erreur:

 The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'http://localhost:4200' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

Après des recherches sur ce problème, il semble comme il n'est pas possible de définir l'option origines = * et les informations d'identification = true dans le même temps. Comment puis-je résoudre ce problème quand j'ai déjà le permis origine dans le WebSocketConfig pour le client de domaine?

Angulaire 2 composant

connect() {
    var socket = new SockJS('http://localhost:8081/chat');
    this.stompClient = Stomp.over(socket);  
    this.stompClient.connect({}, function(result) {
        console.log('Connected: ' + result);
        this.stompClient.subscribe('/topic/messages', function(message) {
            console.log(message);
        });
    });
}    

WebSocketConfig

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat").setAllowedOrigins("http://localhost:4200").withSockJS();
    }
}

localhost:8081/chat/info?t=1490866768565

{"entropy":-1720701276,"origins":["*:*"],"cookie_needed":true,"websocket":true}

MessageController

public class MessageController {
    @MessageMapping("/chat")
    @SendTo("/topic/messages")
    public Message send(Message message) throws Exception {
        return new Message(message.getFrom(), message.getText());
    }
}

SecurityConfig (temporairement permet à tous)

public class SecurityConfig extends Auth0SecurityConfig {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().permitAll();
    }
}

Mise à JOUR

Après quelques tests supplémentaires et de la recherche, il semble que le problème se produit uniquement à l'aide de Chrome. Problème peut-être lié à: https://github.com/sockjs/sockjs-node/issues/177

Mise à JOUR

J'ai créé le CORSFilter comme chsdk mentionné et utilisé le addFilterBefore() méthode: https://stackoverflow.com/a/40300363/4836952.

@Bean
CORSFilter corsFilter() {
    CORSFilter filter = new CORSFilter();
    return filter;
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.addFilterBefore(corsFilter(), SessionManagementFilter.class).authorizeRequests().anyRequest().permitAll();
    http.csrf().disable();
}

Je peux voir que le Filtre est appelé par le débogage, mais le message d'erreur continue à apparaître sur le côté client, même si la bonne Access-Control-Allow-Origin est:

L'en-tête de la réponse ne doit pas être le caractère générique '*' lors de la demande d'informations d'identification du mode

InformationsquelleAutor Sam | 2017-03-30