2016-01-22 19 views
18

Sto progettando un'API che consente all'utente di autenticare (utilizzando token) e che contiene reindirizzamenti all'interno dello stesso dominio. Ora, per una richiesta non autenticata a un endpoint che restituisce 303,Richiesta CORS con Preflight e reindirizzamento: non consentito. Soluzioni alternative?

GET /documents/123 --> 303 redirect to `/documents/abc` 
GET /documents/abc --> 200 

tutto funziona bene.

Facciamo una richiesta autenticata allo stesso endpoint in cui viene inviata l'intestazione Authorization. Questo rende la richiesta di un preflighted request e il browser fa un OPTIONS richiesta di verifica preliminare, cioè

OPTIONS /documents/123 --> 204 (everything okay, please proceed) 
GET /documents/123  --> 303 redirect to `/documents/abc` 

A questo punto, invece di GET ting risorsa reale al /documents/abc, il browser ottiene

XMLHttpRequest cannot load http://localhost:8000/people/username/nschloe. 
The request was redirected to 'http://localhost:8000/people/YDHa-B2FhMie', 
which is disallowed for cross-origin requests that require preflight. 

Questo comportamento è in conformità con the standard:

7.1.5 Cross-origine R equest con verifica preliminare

Se la risposta ha un codice di stato HTTP che non è nel range 2xx

applicare i passaggi di errore di rete.

Questo sembra significare che uno non può fare reindirizza per le risorse autenticate, anche se il redirect è sullo stesso dominio (localhost).

Questo può essere vero? C'è una soluzione comune?

+0

Che aspetto hanno le intestazioni di risposta? Soprattutto Access-Control-Allow-Headers? – Sam

+0

Per la richiesta di preflight 'OPTIONS', ho' Access-Control-Allow-Headers: Accept, Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, Accept-Encoding'. –

+0

Vuoi dire che questo è per l'URL/documenti/abc reindirizzato giusto? – Sam

risposta

11

Lo standard originale preclude il reindirizzamento dopo un preflight CORS riuscito. Quoting § 7.1.5.3:

Questa è la richiesta effettiva. Applicare la procedura di richiesta e osservare le regole di richiesta di seguito mentre si effettua la richiesta.

  • Se la risposta ha un codice di stato HTTP 301, 302, 303, 307, o 308 Applicare i passaggi di errore rete e della cache.

Grazie ai vostri sforzi (grazie!), Il 4 agosto il principio è stato updated per consentire reindirizzare dopo CORS successo controllo preflight.

Fino browser raggiungono, le uniche opzioni possibili sembrano essere uno o una combinazione di:

  1. Problema reindirizza solo per simple requests.
  2. Emettere a 305 redirect, con il proprio URL nell'intestazione Location come "proxy". Preparati per il supporto limitato del browser, poiché 305 è deprecato.
  3. fare un falso "redirect":
    • HTML ritorno con meta refresh/o Javascript Location cambiamento e.
    • restituisce HTML che ha un viewport-filling iframe con il target di reindirizzamento come origine dell'iframe.
    • visualizza un collegamento che l'utente deve fare clic per accedere al contenuto.
+2

quale è il tempo previsto per fornire modifiche come questa dai browser? È ancora un problema nel nuovissimo chrom/firefox. – freakman

+2

@freakman Nella mia esperienza, c'è un ritardo di due anni tra la modifica degli standard e l'implementazione tra le ultime versioni di tutti i principali browser. I browser specifici potrebbero essere aggiornati più rapidamente, ma in generale, direi August 2018. – bishop

+0

Puoi anche generare una pagina HTML che fa clic su un link nascosto. Se il POST HTTP è supportato, anche il modulo nascosto può essere inviato all'endpoint di destinazione – dvsakgec

Problemi correlati