OpenLayers 2.12 et http malheurs d'authentification de base

13

J'essaie d'utiliser OpenLayers 2.12 pour afficher les couches WMS à partir d'un serveur sur lequel l'authentification HTTP de base est activée.

J'ai essayé de gérer l'authentification en mettant le nom d'utilisateur et le mot de passe dans le paramètre URL dans mon code JavaScript. Exemple de création de couche:

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

Bien sûr, cela n'est pas sécurisé car les informations d'identification sont stockées dans du code JavaScript et ne fonctionnent pas dans tous les navigateurs. Internet Explorer 8 donne une erreur de sécurité pointant vers OpenLayers.js et refuse d'afficher la carte du tout. Firefox 13 affiche des boîtes de dialogue d'authentification que je peux annuler (la carte s'affiche correctement après cela). Dans Chrome 23, l'authentification semble fonctionner parfaitement.

Pouvez-vous confirmer qu'il n'est pas possible de gérer l'authentification de base HTTP de manière croisée en la codant dans l'URL et en la donnant à OpenLayers comme dans l'exemple?

Pouvez-vous suggérer d'autres façons de gérer l'authentification de base HTTP afin qu'elle fonctionne de manière transparente pour l'utilisateur (aucune fenêtre contextuelle d'authentification ne s'affiche)? Utilisez peut-être une sorte de serveur proxy pour contourner ce problème.

iluwatar
la source
2
Vous pouvez utiliser un proxy - exemple de proxy docs.openlayers.org/library/request.html > collab.itc.virginia.edu/wiki/toolbox/…
Mapperz
Pour autant que je sache, la seule façon de gérer l'authentification dans OpenLayers est d'utiliser la fonction OpenLayers.Request.issue () ( goo.gl/OKtGj ), qui ne correspond pas à vos besoins.
dariapra
iluwatar> Avez-vous déjà dépassé le problème que FireFox affiche une authentification de connexion? Au moment où vous écrivez, vous pouvez simplement appuyer sur Annuler dans la fenêtre contextuelle, mais c'est dérangeant et déroutant pour l'utilisateur final avec la fenêtre contextuelle d'authentification.
Mike001

Réponses:

7

La solution que nous avons trouvée consistait à ajouter un serveur proxy d'authentification entre le client OpenLayers et le service WMS backend. Ainsi, au lieu de se connecter directement au service WMS, le client OpenLayers se connecte à un serveur proxy qui ajoute les en-têtes d'authentification requis aux demandes.

Exemple de code pour créer les couches:

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

Exemple de configuration de 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

Vous pouvez avoir plusieurs configurations de proxy en utilisant ce style.

Ce que vous devez mettre à l'intérieur des guillemets d'autorisation est juste l'encodage en base 64 de la chaîne "nom d'utilisateur: mot de passe" (sans les guillemets). Pour plus d'informations, consultez ce lien: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t

iluwatar
la source
5

Vous pouvez envoyer une fausse demande ajax avant d'ajouter la couche à la carte. Le navigateur gérera l'authentification de base pour vous:

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

});

Cela ne fonctionnera que si le serveur renvoie un en-tête requis par 401 - auth (dans le géoserveur, vous devez définir la politique de sécurité pour la mettre à l'épreuve ou la mélanger)

Tommaso
la source
L'identifiant de l'appel ajax fait à l'aide de jQuery ...
Tommaso
J'aimerais savoir où exactement je dois placer ça. Dans mon projet, j'utilise GeoExt2, ExtJS 4.2 et OpenLayers 2.12.
g07kore
Je pense que cela pourrait fonctionner dans mon cas. Mais avez-vous des suggestions pour envoyer une fausse demande? Atm J'utilise un href avec le lien vers la demande pour déclencher la fenêtre de connexion, mais je ne veux pas naviguer vers le lien.
geogrow