2012-04-06 18 views
5

OK, wygląda na to, że popełniłem błąd przy pierwszym pytaniu. Oto kilka poprawek. Odpowiedź nadal obowiązuje, ponieważ drugie przekierowanie jest zatrzymywane, gdy następuje zmiana protokołu na HTTPS (SSL).Przeglądarka nie wykonuje przekierowania z odpowiedzi AJAX (odpowiedź generowana przez PHP używa uwierzytelniania CAS)

W moim przypadku wielokrotnie pojawia się przekierowanie, a przeglądarka nie wykonuje drugiego przekierowania. Pierwsze przekierowanie jest przestrzegane, ale zwraca błąd.

Ciągle czytam, że odpowiedzi JavaScript zawierające AJAX zawierające przekierowania są śledzone automatycznie, ale wygląda na to, że nie w moim przypadku. Po pierwszym przekierowaniu automatycznie następuje przeglądarka, a pierwsze przekierowanie jest zwracane bez następującego drugiego przekierowania w nagłówku. Mój problem polega na tym, że chcę, aby wszystkie przekierowania były automatycznie śledzone przez przeglądarkę.

Przekierowania są częścią biblioteki phpCAS. Mam API napisane w PHP, który sprawdza uwierzytelnianie użytkownika za każdym razem, przed zwróceniem wyników.

Oto kolejność. Najważniejszą rzeczą, na którą należy zwrócić uwagę, jest to, że przeglądarka zwraca drugą odpowiedź, po wykonaniu 1 przekierowania. Wolałbym, aby przeszedł całą procedurę i zwrócił ostatnią odpowiedź, gdy wykonuję wywołanie AJAX pod numerem localhost/example/api.

localhost/przykład

  • zwraca localhost/example/api pomocą jQuery.ajax()

reakcji 1 localhost/przykład/API

  • przekierowuje do https://localhost/accounts/cas/login?service=api.example.com&gateway=true (stosując SSL).

Response 2: (SSL) localhost/Konta/CAS/zalogować service = api.example.com & bramy = true

  • Gdy klucz zapytania 'bramy' jest obecny, login po prostu przekierowuje z powrotem do adresu URL dostarczonego przez klucz usługi z biletem lub bez niego (aby zasygnalizować, że użytkownik jest zalogowany lub nie).

Odpowiedź 3: localhost/api bilet = BILET

  • Weryfikuje bilet i przekierowuje z powrotem do siebie bez biletu.

Response 4: localhost/api

  • Tym razem klient CAS patrzy na $ _SESSION pamiętać, jaki był bilet, a następnie przetwarza żądanie API powrocie jsonp.

Nie ma żadnego szczególnego powodu, dla którego używam CAS przez OpenID lub OpenAuth (orization).CAS był tylko pierwszym modułem uwierzytelniającym, dzięki któremu mogłem pracować w WordPressie. Jestem otwarty na sugestie dotyczące korzystania z innej biblioteki uwierzytelniania, CMS, framework itp. Mam nadzieję, że właśnie zakończę ten projekt. Więc im mniej narzędzi ponownie, tym lepiej.

+0

Co wiesz, wysłałem to pytanie po przeszukaniu przez StackOverflow na jakiś czas. Następnie po zamieszczeniu pytania wykonuję kolejne wyszukiwanie i znajduję podobne pytanie na StackOverflow. http://stackoverflow.com/questions/2961051/cas-authentication-and-redirects-with-jquery-ajax –

+0

Wygląda na to, ponieważ druga odpowiedź używa innego protokołu (SSL), a subdomena jest inna, to spowodowałby błąd. Myślę, że to oznaczałoby, że przeglądarka śledzi przekierowania, ale nie wtedy, gdy coś się zmienia (prototocol? Lub subodmain? Lub oba?), A dane nie są zwracane w odpowiedzi (w przeciwnym razie być może odpowiedź JSONP mogłaby zostać dodana w tym momencie. ... Muszę to wypróbować ... wzdycham.) –

Odpowiedz

6

Po znalezieniu się w komentarzach, żądania ajaxowe podlegają same origin policy.

Tak, można użyć JSONP - jednak, jeśli masz tyle szczęścia, aby obsługiwać tylko IE8 i nowsze, lepszym rozwiązaniem może być CORS.

Zasadniczo, dodawanie nagłówków, takich jak

access-control-allow-origin: http://api.example.com 
access-control-allow-credentials: true 

na odpowiedź serwera, można obejść wzajemnej polityki pochodzenia.

Zobacz także ten jQuery ticket, aby to trochę pracy z jQuery.

+0

Och, fajne, mógłbym to zrobić, ponieważ mam dostęp do wszystkich subdomen. Czy to zadziała dla wszystkich przeglądarek? –

+0

@BiagioArobba niezupełnie, IE8 +, opera 12+, patrz: http://caniuse.com/#search=cors – Razor