musiałem rozwiązać dokładnie ten problem. Jedyne rozwiązanie, jakie mogłem wymyślić, to użycie odwrotnego proxy. Działa to tak:
Browser (request without basic authentication) -> Reverse Proxy (request with added basic authentication) -> Destination server (requires basic authentication)
Tak więc istnieje odwrotne proxy działające gdzieś oddzielnie od serwera docelowego. Szczegóły podstawowego uwierzytelnienia są przechowywane w odwrotnym proxy.
Wypowiedz URL w iframe
wygląda następująco (przy założeniu, że reverse proxy działa na porcie 8088
):
<iframe src="http://proxy_id.proxy_host.com:8088/cgi-bin/some/path"></iframe>
Odwrotna proxy następnie przekłada żądanie wyglądać następująco:
http://destination_host.com:PORT/cgi-bin/some/path
Gdzie destination_host
, PORT
i szczegóły podstawowego uwierzytelnienia (wysłane do serwera docelowego jako nagłówki żądań, aby nie były już widoczne w adresie URL) są pobierane z odwrotnej konfiguracji proxy na podstawie proxy_id
, który był w oryginalnym adresie URL.
Odwrotna proxy będzie zmienić nagłówek host
(od *.proxy_host.com
do destination_host.com
), ale to nie zmieni ścieżkę, więc proxy jest przezroczysty do wszelkich wniosków pochodzących z przeglądarki, w tym wszelkich cząstkowych wniosków o dopuszczenie do pobrania CSS lub JavaScript plików , a nawet do wszystkich żądań zainicjowanych z JavaScript.
Ta konfiguracja wymaga odpowiednich wpisów DNS tak, że proxy_id.proxy_host.com
postanawia OD odwrotnego proxy i destination_host.com
postanawia OD serwera docelowego. W zależności od wymagań proxy_host
może być w rzeczywistości taki sam jak destination_host
(np. Jeśli serwer proxy działa na serwerze docelowym).
To był podstawowy pomysł. W moim projekcie konfiguracja proxy może być dynamicznie dodawana, więc musiałem upewnić się, że wszystkie subdomen domeny głównej *.some_host.com
rozwiązuje się z tym samym IP odwrotnego proxy. Używam do tego celu Acrylic DNS, ponieważ domyślny plik Windows hosts
nie obsługuje subdomen jako *
(catch-all).
W zależności od wymagań twoich projektów możesz znaleźć odpowiednie odwrotne proxy, które może być użyte do tego celu. Mój projekt został napisany w Erlangu i nie mogłem znaleźć żadnego proxy, z którego mógłbym skorzystać, więc zaimplementowałem własne. Sprawdź to na github: yoonka/charreada.Nie ma jeszcze dokumentacji, ale kod jest dość prosty. Mogłoby to potencjalnie być używane z każdym projektem napisanym w dowolnym języku, ale obecnie ograniczenie polega na tym, że konfiguracja jest dodawana za pomocą wywołań Erlang (jak w moim projekcie jest dostarczana z innej aplikacji Erlang). Czytanie konfiguracji z pliku statycznego, jak również lepszej dokumentacji, można dodać, jeśli tylko istnieje na to popyt :)