Spring /login CORS

Odpowiedz Nowy wątek
2019-06-04 13:37
0

Siema
Mam pytanie odnośnie architektury.
Wymyśliłem sobie że zrobię dwa projekty pierwszy będzie to REST Spring serwer(www.example1.pl/api), a drugi to serwer zwracający frontend Reactowy (www.example2.pl) który wykonuje np fetch('www.example1.pl/api/dane").
Ogólnie udało mi się wyłączyć zabezpieczenie cors dla wszystkich endpointów lecz nadal nie mogę wysyłać posta na url www.example1.pl/login w celu uzyskania cookisa sesji.
No i pytania:

  1. Pozostać przy koncepcji dwa osobne serwery front/backend czy zmienić aby to www.example1.pl/ zwracało całą stronę reactową.

  2. W jaki sposób wyłączyć cors dla www.example1.pl/login

  3. Zmiana koncepcji: rejestracja i logowanie poprzez front zwracany z backendu, uzyskujemy tam pewien ID który potem wysyłamy z reacta(www.example2.pl) do odpowiednich endpointów
    które sprawdzają w bazie czy dany ID jest przypisany do jakiegoś użytkownika, jeżeli tak to zwraca dane

    
    fetch("http://localhost:9666/api/data",{method:"POST",body:{ID:3125165}})
    .then(res => res.json())
    .then(elem => console.log(elem))  
// Sprawdzam na stronie frontend wysyłanie posta na /login backendu
var formData =new FormData(); 
formData.append('username','test');
 formData.append('password','test');
fetch("http://localhost:9666/login",{method:"POST",body:formData})
.then(res => res.json())
.then(elem => console.log(elem))  

//Access to fetch at 'http://localhost:9666/login' from origin 'http://localhost:8081' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
// wykonując mode:"no-cors"  Cross-Origin Read Blocking (CORB) blocked cross-origin response http://krancki.ddns.net:9666/ with MIME type application/json

//SpringSecurityConfig
@Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers(HttpMethod.POST,"/api/user").permitAll()
                .antMatchers(HttpMethod.DELETE,"/api/user/*").hasRole("ADMIN")
                .antMatchers("/api/user/*").hasRole("ADMIN")
                .antMatchers(HttpMethod.GET,"/api/book").permitAll()
                .antMatchers("/api/book/*").authenticated()
                .antMatchers("/api/library").authenticated()
                .antMatchers(HttpMethod.POST,"/api/book").hasRole("ADMIN")
                .antMatchers(HttpMethod.DELETE,"/api/book/*").hasRole("ADMIN")
                .and()
                .formLogin()
                .passwordParameter("password")
                .usernameParameter("username")
                .and()
                .logout().deleteCookies("JSESSIONID").invalidateHttpSession(true)
                .permitAll()
                .and()
                .httpBasic()
                .and()
                .csrf().disable()
                .cors();
    }

//MvcConfig 
   @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**/*").allowedOrigins("*");
    }
edytowany 3x, ostatnio: krancki, 2019-06-04 13:51

Pozostało 580 znaków

2019-06-04 22:09
0

NO ONE ?

Pozostało 580 znaków

2019-06-05 17:16
0

Z jednej strony można ominąć problem z corsami.
Na podstawie strony https://developer.oxforddictionaries.com/
najpierw rejestracja oraz logowanie na stronie zwróconej z tego serwera.
Dostajemy klucz/numer który potem musimy wysłać w header do odpowiednich endpointów które mają corsy odblokowane. Klucze pozwalają na sprawdzenie czy dany request może mieć dostęp do tych endpointów .

edytowany 1x, ostatnio: krancki, 2019-06-05 17:16

Pozostało 580 znaków

2019-06-09 12:30
0

Przy takiej konfiguracji SOP nie blokuje, ładnie dostajemy odpowiedz od serwera tylko cookie z sesją się nie zapisują. Ktoś jakiś pomysł ?


    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);

        return source;
    }

Pozostało 580 znaków

2019-06-10 10:23

Temat rozwiązany.
Aby uzyskać cookie w requescie musimy dać credentials:'include'

var formData =new FormData();
formData.append('username','test1'); 
formData.append('password','test1');

fetch("http://localhost:9666/login",{
method:"POST",
 credentials:'include',
'body':formData})
.then(res => res.json())
edytowany 1x, ostatnio: krancki, 2019-06-10 10:23

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0