Cors request with Preflight and redirect: disallowed. Obejścia?

Projektuję API, które pozwala użytkownikowi na uwierzytelnianie (za pomocą tokenów) i które zawiera przekierowania w tej samej domenie. Teraz, dla nieautoryzowanego żądania do punktu końcowego, który zwraca 303,

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

Wszystko ładnie się układa.

Wykonajmy uwierzytelnione żądanie do tego samego punktu końcowego, do którego wysyłany jest nagłówek Authorization. To sprawia, że żądanie jest preflighted request, a przeglądarka wykonuje preflight OPTIONS request, czyli

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

W tym momencie, zamiast z GETting rzeczywistego zasobu w /documents/abc, przeglądarka daje

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.

To zachowanie jest zgodne z standardem :

7.1.5 zapytanie krzyżowe z inspekcją wstępną

Jeśli odpowiedź ma kod statusu HTTP, który nie znajduje się w zakresie 2xx

Zastosuj kroki błędu sieci.

Wydaje się to oznaczać, że jeden nie może robić przekierowań dla uwierzytelnionych zasobów, nawet jeśli przekierowanie znajduje się w tej samej domenie (localhost).

Czy to naprawdę może być prawda? Czy istnieje wspólne obejście?
Author: Nico Schlömer, 2016-01-22

1 answers

Oryginalny standard nie wyklucza przekierowania po udanej inspekcji wstępnej CORS. cytowanie § 7.1.5.3:

To jest rzeczywiste żądanie. Zastosuj kroki zgłoś żądanie i przestrzegaj poniższych zasad podczas składania żądania.

    Jeśli odpowiedź ma kod statusu HTTP 301, 302, 303, 307 lub 308 Zastosuj kroki błędu pamięci podręcznej i sieci.

Dzięki twoim wysiłkom (dzięki!), 4 sierpnia standard został zaktualizowany aby umożliwić przekierowanie po pomyślnym sprawdzeniu wstępnym Kors.

Dopóki przeglądarki nie nadrobią zaległości, jedyną możliwą opcją wydaje się być jedna lub kombinacja:

  1. problem przekierowuje tylko dla prostych żądań.
  2. Wydaj 305 przekierowanie , z własnym adresem URL w nagłówku Location jako "proxy". Przygotuj się na ograniczoną obsługę przeglądarki, ponieważ 305 jest przestarzały.
  3. zrób fałszywe "przekierowanie":
    • return HTML with meta refresh and / or Javascript Location zmiana.
    • zwraca HTML, który ma viewport-filling {[3] } z celem redirect jako źródłem iframe.
    • wyświetla link, który użytkownik musi kliknąć, aby uzyskać dostęp do treści.
 12
Author: bishop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 15:10:13