Problemas de autenticação básica do OpenLayers 2.12 e http

13

Estou tentando usar o OpenLayers 2.12 para exibir camadas WMS de um servidor com a autenticação básica HTTP habilitada.

Tentei manipular a autenticação colocando o nome de usuário e a senha no parâmetro URL no meu código JavaScript. Exemplo de criação de camada:

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

É claro que isso não é seguro, pois as credenciais são armazenadas no código JavaScript e não funcionam em todos os navegadores. O Internet Explorer 8 apresenta um erro de segurança apontando para o OpenLayers.js e se recusa a exibir o mapa. O Firefox 13 exibe algumas caixas de diálogo de autenticação que eu posso cancelar (o mapa é exibido corretamente depois disso). No Chrome 23, a autenticação parece funcionar perfeitamente.

Você pode confirmar que não é possível manipular a autenticação básica HTTP de maneira cruzada do navegador, codificando-a na URL e fornecendo-a aos OpenLayers, como no exemplo?

Você pode sugerir maneiras alternativas de lidar com a autenticação básica HTTP para que funcione de forma transparente para o usuário (nenhum pop-up de autenticação é exibido)? Talvez use algum tipo de servidor proxy para solucionar isso.

iluwatar
fonte
2
Você pode usar um Proxy - docs.openlayers.org/library/request.html exemplo de proxy> collab.itc.virginia.edu/wiki/toolbox/…
Mapperz
Até onde eu sei, a única maneira de lidar com a autenticação no OpenLayers é usando a função OpenLayers.Request.issue () ( goo.gl/OKtGj ), que não atende às suas necessidades.
dariapra
Você já passou pelo problema de o FireFox mostrar uma autenticação de login? Enquanto você escreve, basta pressionar cancelar no pop-up, mas é perturbador e confuso para o usuário final com o pop-up de autenticação.
21413 Mike13

Respostas:

7

A solução que encontramos foi adicionar um servidor proxy de autenticação entre o cliente OpenLayers e o serviço WMS de back-end. Portanto, em vez de se conectar diretamente ao serviço WMS, o cliente OpenLayers se conecta a um servidor proxy que adiciona os cabeçalhos de autenticação necessários às solicitações.

Exemplo de código para criar as camadas:

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

Exemplo de configuração do 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

Você pode ter várias configurações de proxy usando este estilo.

O que você deve colocar dentro das aspas de autorização é apenas a codificação base-64 da string "nome de usuário: senha" (sem as aspas). Para obter mais informações, consulte este link: /programming/567814/apache2-reverse-proxy-to-an-end-point-point-requires-basicauth-but-want-to-hide-t

iluwatar
fonte
5

Você pode enviar uma solicitação ajax falsa antes de adicionar a camada ao mapa. O navegador manipulará a autenticação básica para você:

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

});

Isso funcionará apenas se o servidor retornar um cabeçalho obrigatório de 401 - autenticação (no servidor geográfico, você deve definir a política de segurança para desafiar ou misturar)

Tommaso
fonte
O ID de chamada ajax feito usando jQuery ...
Tommaso
Eu adoraria saber onde exatamente eu preciso colocar isso. No meu projeto, estou usando GeoExt2, ExtJS 4.2 e OpenLayers 2.12.
precisa saber é o seguinte
Eu acho que isso poderia funcionar no meu caso. Mas você tem alguma sugestão de como posso enviar uma solicitação falsa? Atm eu uso um href com o link para a solicitação para acionar o pop-up de login, mas eu não quero navegar para o link.
Georgow