Popravljanje 401-ih pomoću CORS pretvarača i proljetnog osiguranja

1. Pregled

U ovom kratkom vodiču naučit ćemo kako riješiti pogrešku "Odgovor za pretisak ima nevažeći HTTP statusni kôd 401", koja se može pojaviti u aplikacijama koje podržavaju međusobnu komunikaciju i koriste Spring Security.

Prvo ćemo vidjeti što su zahtjevi za međusobno podrijetlo, a zatim ćemo riješiti problematičan primjer.

2. Zahtjevi za višestruko podrijetlo

Zahtjevi za više podrijetla su ukratko HTTP zahtjevi u kojima se podrijetlo i cilj zahtjeva razlikuju. To je slučaj, na primjer, kada se web aplikacija poslužuje s jedne domene, a preglednik šalje AJAX zahtjev poslužitelju u drugoj domeni.

Da bi upravljao zahtjevima za višestrukim podrijetlom, poslužitelj mora omogućiti određeni mehanizam poznat kao CORS ili Cross-Origin Resource Sharing.

Prvi korak u CORS-u je OPCIJE zahtjev za utvrđivanje podržava li ga cilj zahtjeva. To se naziva zahtjev prije leta.

Poslužitelj tada može odgovoriti na zahtjev prije leta kolekcijom zaglavlja:

  • Access-Control-Allow-Origin: Definira koja podrijetla mogu imati pristup resursu. "*" Predstavlja bilo koje podrijetlo
  • Access-Control-Allow-Methods: Označava dopuštene HTTP metode za zahtjeve za višestrukim podrijetlom
  • Access-Control-Allow-Headers: Označava dopuštena zaglavlja zahtjeva za unakrsne zahtjeve
  • Access-Control-Max-Age: Definira vrijeme isteka rezultata predmemoriranog zahtjeva za pretisak

Dakle, ako zahtjev prije leta ne ispunjava uvjete utvrđene iz ovih zaglavlja odgovora, stvarni zahtjev za daljnjim postupkom izbacit će pogreške povezane sa zahtjevom za više podrijetla.

Lako je dodati CORS podršku našoj usluzi na proljeće, ali ako je pogrešno konfigurirana, ovaj zahtjev prije leta uvijek neće uspjeti s brojem 401.

3. Stvaranje REST API-ja s omogućenim CORS-om

Da bismo simulirali problem, napravimo najprije jednostavan REST API koji podržava zahtjeve za višestrukim podrijetlom:

@RestController @CrossOrigin ("// localhost: 4200") javna klasa ResourceController {@GetMapping ("/ user") javni niz korisnika (Principal principal) {return principal.getName (); }}

The @CrossOrigin napomena osigurava da su naši API-ji dostupni samo iz podrijetla spomenutog u njegovom argumentu.

4. Osiguravanje našeg REST API-ja

Osigurajmo sada svoj REST API s Spring Security:

@EnableWebSecurity javna klasa WebSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (HttpSecurity http) baca izuzetak {http .authorizeRequests () .anyRequest (). Authenticated () .and () .httpBasic (); }}

U ovoj konfiguracijskoj klasi izvršili smo autorizaciju svih dolaznih zahtjeva. Kao rezultat toga, odbit će sve zahtjeve bez valjanog tokena autorizacije.

5. Podnošenje zahtjeva prije leta

Sad kad smo stvorili svoj REST API, isprobajmo zahtjev prije leta koristeći kovrča:

curl -v -H "Metoda zahtjeva za kontrolu pristupa: GET" -H "Porijeklo: // localhost: 4200" -X OPTIONS // localhost: 8080 / user ... <HTTP / 1.1 401 ... <WWW -Authenticate: Basic carm = "Realm" ... <Vary: Origin <Vary: Access-Control-Request-Method <Vary: Access-Control-Request-Headers <Access-Control-Allow-Origin: // localhost: 4200 <Access-Control-Allow-Methods: POST <Access-Control-Allow-Credentials: true <Dopusti: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH ...

Iz rezultata ove naredbe to možemo vidjeti zahtjev je odbijen s 401.

Budući da je ovo kovrča naredba, u izlazu nećemo vidjeti pogrešku "Odgovor za pretisak ima nevažeći HTTP statusni kod 401".

Ali tu točnu pogrešku možemo reproducirati stvaranjem prednje aplikacije koja troši naš REST API s druge domene i pokrećući je u pregledniku.

6. Rješenje

Nismo izričito izuzeli zahtjeve za pretiskivanje iz autorizacije u našoj konfiguraciji Spring Security. Ne zaboravite da Spring Security osigurava svi krajnje točke prema zadanim postavkama.

Kao rezultat, naš API očekuje i token autorizacije u zahtjevu OPTIONS.

Spring pruža rješenje iz okvira za izuzeće OPTIONS zahtjeva iz provjera autorizacije:

@EnableWebSecurity javna klasa WebSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {// ... http.cors (); }}

The cors () metoda će dodati Spring-provided CorsFilter na kontekst aplikacije koji zauzvrat zaobilazi provjere autorizacije za OPTIONS zahtjeve.

Sada možemo ponovno testirati našu aplikaciju i vidjeti da li radi.

7. Zaključak

U ovom kratkom članku naučili smo kako ispraviti pogrešku "Odgovor za pretisak ima nevažeći HTTP statusni kôd 401" koja je povezana sa Spring Spring zahtjevima i zahtjevima za više podrijetla.

Imajte na umu da bi se, na primjeru, klijent i API trebali izvoditi na različitim domenama ili lukama kako bi ponovno stvorili problem. Na primjer, možemo mapirati zadani naziv hosta na klijenta, a IP adresu računala na naš REST API kada se izvodi na lokalnom računalu.

Kao i uvijek, primjer prikazan u ovom vodiču možete pronaći na Githubu.


$config[zx-auto] not found$config[zx-overlay] not found