OpenLayers 2.12 e http guai di autenticazione di base


13

Sto cercando di utilizzare OpenLayers 2.12 per visualizzare i livelli WMS da un server in cui è abilitata l'autenticazione di base HTTP.

Ho provato a gestire l'autenticazione inserendo il nome utente e la password nel parametro URL nel mio codice JavaScript. Esempio di creazione di layer:

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
        });

Naturalmente questo non è sicuro poiché le credenziali sono memorizzate nel codice JavaScript e non funzionano in tutti i browser. Internet Explorer 8 fornisce un errore di sicurezza che punta a OpenLayers.js e si rifiuta di visualizzare la mappa. Firefox 13 apre alcune finestre di dialogo di autenticazione che posso annullare (la mappa viene visualizzata correttamente dopo quella). In Chrome 23 l'autenticazione sembra funzionare alla perfezione.

Potete confermare che non è possibile gestire l'autenticazione di base HTTP in modo cross-browser codificandola nell'URL e dandola a OpenLayer come nell'esempio?

Puoi suggerire modi alternativi per gestire l'autenticazione di base HTTP in modo che funzioni in modo trasparente per l'utente (non vengono visualizzati popup di autenticazione)? Forse utilizzare un qualche tipo di server proxy per aggirare questo.


2
È possibile utilizzare un proxy - docs.openlayers.org/library/request.html esempio di proxy> collab.itc.virginia.edu/wiki/toolbox/…
Mapperz

Per quanto ne so, l'unico modo di gestire l'autenticazione in OpenLayers è utilizzare la funzione OpenLayers.Request.issue () ( goo.gl/OKtGj ), che non soddisfa le tue esigenze.
dariapra,

iluwatar> Hai mai superato il problema che FireFox mostra un'autenticazione di accesso? Mentre scrivi, puoi semplicemente premere Annulla sul popup, ma è inquietante e confuso per l'utente finale con il popup di autenticazione.
Mike001,

Risposte:


7

La soluzione che abbiamo trovato è stata quella di aggiungere un server proxy di autenticazione tra il client OpenLayers e il servizio WMS back-end. Pertanto, invece di connettersi direttamente al servizio WMS, il client OpenLayers si connette a un server proxy che aggiunge le intestazioni di autenticazione richieste alle richieste.

Codice di esempio per la creazione dei livelli:

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

Esempio di configurazione del 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

Puoi avere più configurazioni proxy usando questo stile.

Quello che dovresti inserire nelle virgolette di autorizzazione è solo la codifica base-64 della stringa "nomeutente: password" (senza virgolette). Per ulteriori informazioni consultare questo link: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t


5

Puoi inviare una falsa richiesta Ajax prima di aggiungere il layer alla mappa. Il browser gestirà l'autenticazione di base per te:

// 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
    }

});

Funzionerà solo se il server restituisce un'intestazione 401 - auth richiesta (nel geoserver devi impostare la politica di sicurezza su challenge o mista)


L'ID chiamata ajax fatto usando jQuery ...
Tommaso

Mi piacerebbe sapere esattamente dove devo posizionarlo. Nel mio progetto sto usando GeoExt2, ExtJS 4.2 e OpenLayers 2.12.
g07kore,

Penso che questo potrebbe funzionare nel mio caso. Ma hai qualche suggerimento su come posso inviare una richiesta falsa? Atm Uso un href con il collegamento alla richiesta per attivare il popup di accesso, ma non desidero accedere al collegamento.
geogrow
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.