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

13

Estoy tratando de usar OpenLayers 2.12 para mostrar capas WMS de un servidor que tiene habilitada la autenticación básica HTTP.

Intenté 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:[email protected]/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 funcionan en todos los navegadores. Internet Explorer 8 genera un error de seguridad que apunta a OpenLayers.js y se niega a mostrar el mapa. Firefox 13 muestra algunos cuadros de diálogo 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.

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

¿Puede sugerir formas alternativas de manejar la autenticación básica HTTP para que funcione de manera transparente para el usuario (no se muestran ventanas emergentes de autenticación)? Quizás use algún tipo de servidor proxy para solucionar esto.

iluwatar
fuente
Hasta donde sé, la única forma de manejar la autenticación en OpenLayers es usando la función OpenLayers.Request.issue () ( goo.gl/OKtGj ), que no se adapta a sus necesidades.
dariapra
iluwatar> ¿Alguna vez superaste el problema de que FireFox muestra una autenticación de inicio de sesión? Mientras escribe, puede presionar cancelar en la ventana emergente, pero es inquietante y confuso para el usuario final con la ventana emergente de autenticación.
Mike001

Respuestas:

7

La solución con la que terminamos fue agregar un servidor proxy de autenticación entre el cliente OpenLayers y el servicio back-end WMS. Entonces, en lugar de conectarse directamente al servicio WMS, el cliente OpenLayers se conecta a un servidor proxy que agrega los encabezados de autenticación necesarios 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 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 múltiples configuraciones de proxy usando este estilo.

Lo que debe poner dentro de las comillas de Autorización es solo la codificación en base 64 de la cadena "nombre de usuario: contraseña" (sin las comillas). Para obtener más información, consulte este enlace: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t

iluwatar
fuente
5

Puede enviar una solicitud falsa de ajax antes de agregar la capa al mapa. El navegador se encargará de la autenticación básica por usted:

// 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 funcionará solo si el servidor devuelve un encabezado 401 - auth requerido (en geoserver debe configurar la política de seguridad para desafiar o mezclar)

Tommaso
fuente
La identificación de la llamada ajax se realizó con jQuery ...
Tommaso
Me encantaría saber exactamente dónde necesito colocar eso. En mi proyecto estoy usando GeoExt2, ExtJS 4.2 y OpenLayers 2.12.
g07kore
Creo que esto podría funcionar en mi caso. ¿Pero tiene alguna sugerencia sobre cómo puedo enviar una solicitud falsa? Atm Uso un href con el enlace a la solicitud para activar la ventana emergente de inicio de sesión, pero no quiero navegar al enlace.
geogrow