Bonjour,
En ce moment je fais face à un problème de CORS sur mon api.
Pour résumer un peu la stack, j’ai une api (développée en Java à l’aide du framework Spring boot) qui tourne derrière nginx qui fait office de reverse proxy. Mon api gère les utilisateurs grâce à la bibliothèque spring-security. Jusqu’ici tout va bien.
En local (sans nginx donc), lorsque je lance mon api j’arrive très bien à utiliser tous mes endpoints. Lorsqu’elle se retrouve déployée derrière nginx, mes requêtes GET (même celles qui nécessitent un accès sécurisé par login/password) fonctionnent bien, mais les requêtes de type POST et PUT ne fonctionnent pas.
J’ai bien sur un message d’erreur :
Invalid CORS request
Bon je dois préciser que les même requêtes, lorsqu’elle sont lancées directement en console avec curl fonctionnent très bien, ce qui laisse penser que le problème vient uniquement sur des requêtes XHR.
Pour m’aider il vous faudrait avoir d’autres informations, comme ce bout de code Java dans mon api.
@Bean
public WebMvcConfigurer corsConfigurer() {
log.info(String.format("Enabled CORS for host %s", domainAllowed));
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins(domainAllowed)
.allowedMethods("GET", "PUT", "POST", "DELETE")
.allowCredentials(true)
.maxAge(1728000);
}
};
}
Qui devrait permettre à l’API en interne d’autoriser les CORS (d’ailleurs le code fait son effet puisque lorsque l’API est utilisée sans nginx elle fonctionne).
Ce bout de configuration nginx devrait vous intéresser aussi
server {
ssl on;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization, DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
}
proxy_pass http://127.0.0.1:8080/; # le port sur lequel tourne mon api en vrai
}
}
C’est ce bout de conf (qui pour moi est un peu un hack), qui pose problème, je l’ai trouvé sur la toile (et il fonctionnait plutôt bien il y a un an). J’ignore pourquoi ça ne fonctionne plus comme avant, en sachant que sur cette API, j’ai essentiellement mis à jour 2 choses entre temps :
- la version de mon framework spring boot (
2.0
à2.2
) - la version de nginx (j’ai actuellement la
1.14.2
, mais je ne sais plus laquelle j’avais avant)
Si une âme charitable pouvais m’aider là dessus, j’ai fait pas mal de tests non concluants.
PS: Je me sers de l’outil postman (qui fait des requêtes XHR lui) pour tester le fonctionnement de mon API pour info.
PS 2: J’ai le souvenir que @Eskimon a déjà eu ce genre de souci, mais avec Django plutot (je te ping au cas ou).
Merci d’avance.