Upevnenie 401s pomocou CORS Preflights a Spring Security

1. Prehľad

V tomto krátkom tutoriáli sa naučíme, ako vyriešiť chybu „Odozva na kontrolu pred výstupom má neplatný stavový kód HTTP 401“, ktorá sa môže vyskytnúť v aplikáciách, ktoré podporujú komunikáciu medzi pôvodmi a používajú Spring Security.

Najskôr uvidíme, čo sú žiadosti o krížový pôvod, a potom napravíme problematický príklad.

2. Žiadosti o krížový pôvod

Požiadavky na krížový pôvod sú skrátka žiadosti HTTP, kde sa pôvod a cieľ žiadosti líšia. To je napríklad prípad, keď sa webová aplikácia poskytuje z jednej domény a prehľadávač odošle požiadavku AJAX na server v inej doméne.

Na správu požiadaviek krížového pôvodu musí server povoliť konkrétny mechanizmus známy ako CORS alebo zdieľanie zdrojov krížového pôvodu.

Prvý krok v CORS je MOŽNOSTI žiadosť o určenie, či ju cieľ žiadosti podporuje. Tomu sa hovorí predletová požiadavka.

Server potom môže odpovedať na predletovú požiadavku zbierkou hlavičiek:

  • Access-Control-Allow-Origin: Definuje, ktorý pôvod môže mať prístup k prostriedku. „*“ Predstavuje akýkoľvek pôvod
  • Metódy riadenia prístupu: Označuje povolené metódy HTTP pre požiadavky krížového pôvodu
  • Hlavičky Access-Control-Allow: Označuje povolené hlavičky požiadaviek pre požiadavky krížového pôvodu
  • Access-Control-Max-Age: Definuje čas uplynutia platnosti výsledku požiadavky pred výstupom z pamäte

Takže ak predletová požiadavka nespĺňa podmienky určené z týchto hlavičiek odpovedí, skutočná následná požiadavka spôsobí chyby súvisiace s požiadavkou krížového pôvodu.

Je ľahké pridať podporu CORS do našej pružinovej služby, ale ak je nesprávne nakonfigurovaná, táto predletová požiadavka so 401 vždy zlyhá.

3. Vytvorenie rozhrania REST API s podporou CORS

Aby sme problém simulovali, vytvorme si najskôr jednoduché rozhranie REST API, ktoré podporuje požiadavky krížového pôvodu:

@RestController @CrossOrigin ("// localhost: 4200") verejná trieda ResourceController {@GetMapping ("/ user") verejný používateľ reťazca (hlavný zodpovedný) {return principal.getName (); }}

The @CrossOrigin anotácia zaisťuje, že naše API sú prístupné iba od pôvodu uvedeného v jej argumente.

4. Zabezpečenie nášho REST API

Poďme teraz zabezpečiť naše REST API pomocou Spring Security:

@EnableWebSecurity verejná trieda WebSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (HttpSecurity http) vyvolá výnimku {http .authorizeRequests () .anyRequest (). Authenticated (). A () .httpBasic (); }}

V tejto triede konfigurácie sme vynútili autorizáciu všetkých prichádzajúcich požiadaviek. Vo výsledku odmietne všetky žiadosti bez platného autorizačného tokenu.

5. Zadanie predletovej žiadosti

Teraz, keď sme vytvorili naše REST API, vyskúšajme predletovú požiadavku pomocou zvlnenie:

curl -v -H "Access-Control-Request-Method: GET" -H "Origin: // localhost: 4200" -X OPTIONS // localhost: 8080 / user ... <HTTP / 1.1 401 ... <WWW -Authenticate: Basic realm = "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 <Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH ...

Z výstupu tohto príkazu to vidíme žiadosť bola zamietnutá s 401.

Keďže sa jedná o a zvlnenie príkazu, na výstupe sa nám nezobrazí chyba „Odozva na kontrolu pred výstupom má neplatný stavový kód HTTP 401“.

Túto presnú chybu však môžeme reprodukovať tak, že vytvoríme klientsku aplikáciu, ktorá spotrebuje naše REST API z inej domény, a spustíme ju v prehliadači.

6. Riešenie

V našej konfigurácii Spring Security sme výslovne nevylúčili žiadosti o kontrolu pred výstupom z autorizácie. Pamätajte, že jarná bezpečnosť zaisťuje všetko koncové body.

Ako výsledok, naše API očakáva autorizačný token aj v žiadosti OPTIONS.

Jar poskytuje riešenie pripravené na vylúčenie požiadaviek OPTIONS z kontrol autorizácie:

@EnableWebSecurity verejná trieda WebSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (HttpSecurity http) vyvolá výnimku {// ... http.cors (); }}

The kory () metóda pridá Spring-provided CorsFilter do kontextu aplikácie, ktorá zase obchádza kontroly autorizácie pre požiadavky OPTIONS.

Teraz môžeme našu aplikáciu znova otestovať a zistiť, či funguje.

7. Záver

V tomto krátkom článku sme sa naučili, ako opraviť chybu „Odpoveď na kontrolu pred výstupom má neplatný stavový kód HTTP 401“, ktorá je spojená s požiadavkami Spring Security a cross-origin.

Upozorňujeme, že v tomto príklade by mali byť klient a API spustené na rôznych doménach alebo portoch, aby sa problém znova vytvoril. Napríklad môžeme štandardný názov hostiteľa namapovať na klienta a IP adresu stroja na naše REST API, keď je spustený na lokálnom stroji.

Príklad ako v tomto tutoriále nájdete ako vždy na serveri Github.


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