Podstawowe problemy z uwierzytelnianiem OpenLayers 2.12 i http

13

Próbuję użyć OpenLayers 2.12 do wyświetlenia warstw WMS z serwera z włączoną funkcją podstawowego uwierzytelniania HTTP.

Próbowałem obsłużyć uwierzytelnianie, wpisując nazwę użytkownika i hasło w parametrze URL w moim kodzie JavaScript. Przykład tworzenia warstwy:

myLayer = new OpenLayers.Layer.WMS('background',
        'https://username:[email protected]/rasteriaineistot/image?',
        {
            layers: 'background',
            bbox: '-380188,6249943,1347312,8226943'
        },                                   
        {
            displayInLayerSwitcher: true,
            isBaseLayer: false,
            projection: 'EPSG:3067',
            visibility: true
        });

Oczywiście nie jest to bezpieczne, ponieważ poświadczenia są przechowywane w kodzie JavaScript i nie działają we wszystkich przeglądarkach. Internet Explorer 8 wyświetla błąd bezpieczeństwa wskazujący na OpenLayers.js i w ogóle nie wyświetla mapy. Firefox 13 wyświetla niektóre okna dialogowe uwierzytelniania, które mogę anulować (po tym mapa wyświetla się poprawnie). W Chrome 23 uwierzytelnianie wydaje się działać bezbłędnie.

Czy możesz potwierdzić, że nie można obsłużyć podstawowego uwierzytelniania HTTP w sposób przeglądarkowy, kodując go w adresie URL i przekazując OpenLayers jak w przykładzie?

Czy możesz zasugerować alternatywne sposoby obsługi podstawowego uwierzytelniania HTTP, aby działało ono w sposób przejrzysty dla użytkownika (nie wyświetla się wyskakujące okienko uwierzytelnienia)? Być może użyj jakiegoś serwera proxy, aby obejść ten problem.

iluwatar
źródło
O ile mi wiadomo, jedynym sposobem obsługi uwierzytelniania w OpenLayers jest użycie funkcji OpenLayers.Request.issue () ( goo.gl/OKtGj ), która nie odpowiada Twoim potrzebom.
dariapra,
iluwatar> Czy zdarzyło Ci się kiedyś, że FireFox pokazuje uwierzytelnienie logowania? Podczas pisania możesz po prostu nacisnąć przycisk Anuluj w wyskakującym okienku, ale jest to niepokojące i mylące dla użytkownika końcowego z wyskakującym okienkiem uwierzytelniania.
Mike001

Odpowiedzi:

7

Rozwiązaniem, które zakończyliśmy, było dodanie uwierzytelniającego serwera proxy między klientem OpenLayers a usługą WMS zaplecza. Zamiast więc łączyć się bezpośrednio z usługą WMS, klient OpenLayers łączy się z serwerem proxy, który dodaje wymagane żądania do nagłówków uwierzytelniania.

Przykładowy kod do tworzenia warstw:

var layer = new OpenLayers.Layer.WMS( "background", "http://myproxyaddress.com/23ergwe435dw3463", {layers: 'basic'} );

Przykładowa konfiguracja serwera proxy Apache:

ProxyRequests     Off
ProxyPreserveHost On
SSLProxyEngine On
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
SetEnvIf Request_URI "23ergwe435dw3463" wms_provider_name
RequestHeader set Authorization: "Basic Xk12BLdVNzUo5UGl0po5Y" env=wms_provider_name
ProxyPass         /23ergwe435dw3463  https://wmsprovideraddress.com
ProxyPassReverse  /23ergwe435dw3463  https://wmsprovideraddress.com

Korzystając z tego stylu, możesz mieć wiele konfiguracji proxy.

To, co powinieneś umieścić w cudzysłowie autoryzacji, to po prostu kodowanie base-64 ciągu „nazwa użytkownika: hasło” (bez cudzysłowów). Aby uzyskać więcej informacji, zobacz ten link: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t

iluwatar
źródło
5

Możesz wysłać fałszywe żądanie ajax przed dodaniem warstwy do mapy. Przeglądarka obsłuży dla Ciebie podstawowe uwierzytelnianie:

// Assuming myLayer **WITHOUT** user:pass in the url
$.ajax({
    url: myLayer.url,
    data: myLayer.params,
    method: 'GET',
    error: function(jqXHR, textStatus, errorThrown){
        // Handle not authoruzed here
    },
    success: function(){
        // Yuppieeeeee!
        map.addLayer(myLayer);    // The browser wil set up the 
                                  // authentication in the request for you
    }

});

Działa to tylko wtedy, gdy serwer zwróci nagłówek wymagający uwierzytelnienia 401 (w geoserver musisz ustawić politykę bezpieczeństwa jako wyzwanie lub mieszane)

Tommaso
źródło
Identyfikator wywołania ajax wykonany przy użyciu jQuery ...
Tommaso
Chciałbym wiedzieć, gdzie dokładnie to muszę umieścić. W moim projekcie korzystam z GeoExt2, ExtJS 4.2 i OpenLayers 2.12.
g07kore
Myślę, że to może zadziałać w moim przypadku. Ale czy masz jakieś sugestie, w jaki sposób mogę wysłać fałszywą prośbę? Atm Używam href z linkiem do żądania, aby uruchomić wyskakujące okienko logowania, ale nie chcę nawigować do linku.
geogrow