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:
Vous devez vous connecter pour publier un commentaire.
Problème:
Vous n'êtes pas de la configuration de
'Access-Control-Allow-Origin'
correctement et de votre configuration actuelle est tout simplement ignoré par le serveur.Situation:
La trace de la pile d'Erreur dit:
Cela signifie que, hormis le fait que vous ne pouvez pas définir de
'Access-Control-Allow-Origin'
pour le générique"*"
, votre nom de domaine'http://localhost:4200'
n'est pas autorisé à accéder trop.Pour répondre à votre question:
Solution:
Je suppose que vous n'avez pas besoin de définir le permis origine dans le
WebSocketConfig
parce qu'il est destiné à configurer WebSocket style de messagerie dans les applications web comme indiqué dans WebSocket Support au Printemps de la documentation, vous devez le configurer dans unCORSFilter
classe de configuration qu'il est destiné à configurer le Printemps des Filtres de l'application Web access.C'est ce que vous aurez besoin dans votre
CORSFilter.java
classe de configuration:Vous pouvez voir l'utilisation de :
Pour définir la liste des domaines autorisés à accéder au serveur.
Références:
Vous pouvez avoir besoin de prendre un coup d'oeil à soutien de la SCRO dans Spring Framework et Activation de l'Origine de la Croix de Demandes pour un Service Web RESTful pour en savoir plus à ce sujet.
http.csrf().disable()
dans votre configuration, je pense que vous n'en avez pas besoin dans votre cas..SockJS
parce que le Printemps est configurée correctement.SockJS
comme expliqué dans la question de discussion vous partagé dans votre mise à jour.Cela n'a rien à voir avec votre printemps ou angulaire code de l'application.
Intro à votre problème
Le Access-Control-Allow-Origin est une partie de la SCRO (Cross-Origin Resource sharing) mécanisme qui donne des serveurs web de la croix-domaine des contrôles d'accès. Il est en place pour protéger votre application/site de CSRF (Cross-Site Request Forgery).
De la SCRO /CSRF
Le problème
Maintenant, si nous avons lu votre erreur soigneusement
Il est dit que Access-Control-Allow-Origin d'en-tête ne peut pas être générique.
Avec d'autres mots, maintenant votre back-end est à dire tout le monde de tout le web peut exécuter du code sur mon site.
Ce que nous voulons atteindre: Limite de l'origine à seulement avant la fin de l'app (ng2).
Solution
Maintenant, parce que vous êtes à l'aide de Printemps, je vais supposer que vous l'utilisez avec Apache Tomcat en tant que votre serveur web.
De la SCRO sont difined comme filtre dans votre site web.conf (tomcat dossier)
trouver cette ligne
et modifier la * pour http://localhost:4200
pour plus d'informations sur la config de la SCRO dans Tomcat veuillez lire ce
MODIFIER ( Printemps de démarrage )
Parce que vous êtes à l'aide de spring boot, vous pouvez déléguer la configuration de la scro du cadre.
Veuillez suivre ce tutoriel sur le printemps.io ( comme chsdk proposé )pour obtenir une meilleure compréhension de la SCRO de configuration de spring boot .
application.properties
fichier dans votre Ressort de démarrage de l'application.ma réponse est trop tard mais je vais poster ce que si quelqu'un pouvait faire face au même problème, j'ai été confronté au même cross-origin question.
Fondamentalement, si vous utilisez le Printemps de Sécurité mis en place sur votre serveur d'application côté, c'est Probablement lui qui bloque websocket handshaker
Vous avez à dire à Ressort de sécurité pour permettre à votre websocket points de terminaison afin de permettre à douille poignée de main...
à l'aide de
Donc sockjs sera en mesure maintenant d'envoyer un GET (Http) demande de la poignée de main avant de passer au protocole Websocket
C'est le Printemps, la Configuration de sécurité
C'est WebSocket de configuration du Broker
Juste ajouter
.setAllowedOrigins("*")
à webSocket config.La version de webSocket est 1.4.1.VERSION,vous devez mettre à jour votre version si la méthode n'était pas indiqué.