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:password@ws.nls.fi/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.



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


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)


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.