13 votos

OpenLayers 2.12 y los problemas de autenticación básica http

Estoy intentando utilizar OpenLayers 2.12 para mostrar capas WMS desde un servidor que tiene activada la autenticación básica HTTP.

He intentado manejar la autenticación poniendo el nombre de usuario y la contraseña en el parámetro URL en mi código JavaScript. Ejemplo de creación de capa:

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

Por supuesto, esto no es seguro, ya que las credenciales se almacenan en código JavaScript y no funciona en todos los navegadores. Internet Explorer 8 da un error de seguridad que apunta a OpenLayers.js y se niega a mostrar el mapa en absoluto. Firefox 13 muestra algunos diálogos de autenticación que puedo cancelar (el mapa se muestra correctamente después de eso). En Chrome 23 la autenticación parece funcionar sin problemas.

¿Puedes confirmar que no es posible manejar la autenticación básica HTTP de forma cruzada entre navegadores codificándola en la URL y dándosela a OpenLayers como en el ejemplo?

¿Puede sugerir formas alternativas de manejar la autenticación básica HTTP para que funcione de forma transparente para el usuario (sin que aparezcan ventanas emergentes de autenticación)? Tal vez utilizar algún tipo de servidor proxy para solucionar esto.

7voto

ketan Puntos 48

La solución que encontramos fue añadir un servidor proxy de autenticación entre el cliente de OpenLayers y el servicio WMS backend. Así, en lugar de conectarse directamente al servicio WMS, el cliente OpenLayers se conecta a un servidor proxy que añade las cabeceras de autenticación necesarias a las solicitudes.

Código de ejemplo para crear las capas:

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

Ejemplo de configuración del proxy de 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

Puede tener varias configuraciones de proxy utilizando este estilo.

Lo que debe poner dentro de las comillas de Autorización es simplemente la codificación base-64 de la cadena "username:password" (sin las comillas). Para más información, consulte este enlace: https://stackoverflow.com/questions/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t

5voto

Ne An Derthal Puntos 39789

Puedes enviar una falsa petición ajax antes de añadir la capa al mapa. El navegador se encargará de la autenticación básica por ti:

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

});

Esto sólo funcionará si el servidor devuelve una cabecera 401 - auth required (en geoserver hay que configurar la política de seguridad como challenge o mixed)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X