OpenLayers 2.12 und HTTP-Standardauthentifizierung

13

Ich versuche, OpenLayers 2.12 zu verwenden, um WMS-Ebenen von einem Server anzuzeigen, auf dem die HTTP-Basisauthentifizierung aktiviert ist.

Ich habe versucht, mit der Authentifizierung umzugehen, indem ich den Benutzernamen und das Passwort in den URL-Parameter meines JavaScript-Codes eingegeben habe. Beispiel für eine Layer-Erstellung:

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

Dies ist natürlich nicht sicher, da die Anmeldeinformationen im JavaScript-Code gespeichert sind und nicht in allen Browsern funktionieren. Internet Explorer 8 gibt einen Sicherheitsfehler aus, der auf OpenLayers.js verweist, und verweigert die Anzeige der Karte. Firefox 13 zeigt einige Authentifizierungsdialoge an, die ich abbrechen kann (die Karte wird danach korrekt angezeigt). In Chrome 23 scheint die Authentifizierung einwandfrei zu funktionieren.

Können Sie bestätigen, dass die HTTP-Basisauthentifizierung nicht browserübergreifend gehandhabt werden kann, indem Sie sie in der URL verschlüsseln und OpenLayers wie im Beispiel übergeben?

Können Sie alternative Vorgehensweisen für die HTTP-Basisauthentifizierung vorschlagen, damit diese für den Benutzer transparent funktioniert (es werden keine Authentifizierungs-Popups angezeigt)? Verwenden Sie möglicherweise eine Art Proxy-Server, um dies zu umgehen.

iluwatar
quelle
2
Sie können ein Proxy verwenden - docs.openlayers.org/library/request.html Proxy-Beispiel> collab.itc.virginia.edu/wiki/toolbox/…
Mapperz
Soweit ich weiß, können Sie die Authentifizierung in OpenLayers nur mit der Funktion OpenLayers.Request.issue () ( goo.gl/OKtGj ) durchführen, die nicht Ihren Anforderungen entspricht.
Dariapra
iluwatar> Haben Sie jemals das Problem überwunden, dass FireFox eine Anmeldeauthentifizierung anzeigt? Während Sie schreiben, können Sie im Popup nur auf Abbrechen drücken, aber es ist störend und verwirrend für den Endbenutzer mit dem Authentifizierungs-Popup.
Mike001

Antworten:

7

Die Lösung bestand darin, einen authentifizierenden Proxyserver zwischen dem OpenLayers-Client und dem Back-End-WMS-Dienst hinzuzufügen. Anstatt sich direkt mit dem WMS-Dienst zu verbinden, stellt der OpenLayers-Client eine Verbindung zu einem Proxyserver her, der den Anforderungen die erforderlichen Authentifizierungsheader hinzufügt.

Beispielcode zum Erstellen der Ebenen:

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

Beispiel für eine Apache-Proxy-Konfiguration:

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

Sie können mit diesem Stil mehrere Proxy-Konfigurationen verwenden.

Was Sie in die Authorization-Anführungszeichen setzen sollten, ist nur die Base-64-Codierung der Zeichenfolge "Benutzername: Kennwort" (ohne die Anführungszeichen). Weitere Informationen finden Sie unter folgendem Link: /programming/567814/apache2-reverse-proxy-to-an-end-point-the-reverse-basicauth-but-want-to-hide-t

iluwatar
quelle
5

Sie können eine gefälschte Ajax-Anfrage senden, bevor Sie den Layer zur Karte hinzufügen. Der Browser übernimmt die grundlegende Authentifizierung für Sie:

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

});

Dies funktioniert nur, wenn der Server einen für die 401-Authentifizierung erforderlichen Header zurückgibt (in Geoserver müssen Sie die Sicherheitsrichtlinie auf Challenge oder Mixed einstellen).

Tommaso
quelle
Die Ajax-Aufruf-ID erfolgt mit jQuery ...
Tommaso
Ich würde gerne wissen, wo genau ich das platzieren muss. In meinem Projekt verwende ich GeoExt2, ExtJS 4.2 und OpenLayers 2.12.
g07kore
Ich denke, das könnte in meinem Fall funktionieren. Aber haben Sie Vorschläge, wie ich eine gefälschte Anfrage senden kann? Atm Ich benutze ein href mit dem Link zur Anfrage, um das Login-Popup auszulösen, aber ich möchte nicht zum Link navigieren.
Geogrow