OpenLayers 2.12 и проблемы базовой аутентификации http

13

Я пытаюсь использовать OpenLayers 2.12 для отображения слоев WMS с сервера, на котором включена базовая аутентификация HTTP.

Я попытался обработать аутентификацию, указав имя пользователя и пароль в параметре URL в моем коде JavaScript. Пример создания слоя:

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

Конечно, это небезопасно, поскольку учетные данные хранятся в коде JavaScript и работают не во всех браузерах. Internet Explorer 8 выдает ошибку безопасности, указывающую на OpenLayers.js, и вообще отказывается отображать карту. Firefox 13 выскакивает некоторые диалоги аутентификации, которые я могу отменить (карта отображается правильно после этого). В Chrome 23 аутентификация работает безупречно.

Можете ли вы подтвердить, что невозможно обработать базовую аутентификацию HTTP кросс-браузерным способом, кодируя ее в URL и передавая ее OpenLayers, как в примере?

Можете ли вы предложить альтернативные способы обработки базовой аутентификации HTTP, чтобы она работала прозрачно для пользователя (не отображаются всплывающие окна аутентификации)? Возможно, используйте какой-то прокси-сервер, чтобы обойти это.

iluwatar
источник
2
Вы можете использовать прокси - docs.openlayers.org/library/request.html пример прокси> collab.itc.virginia.edu/wiki/toolbox/…
Mapperz
Насколько я знаю, единственным способом обработки аутентификации в OpenLayers является использование функции OpenLayers.Request.issue () ( goo.gl/OKtGj ), которая не соответствует вашим потребностям.
Дарьяпра
iluwatar> Вы когда-нибудь сталкивались с проблемой, что FireFox показывает аутентификацию при входе? Когда вы пишете, вы можете просто нажать «Отмена» во всплывающем окне, но это беспокоит и сбивает с толку конечного пользователя с помощью всплывающего окна аутентификации.
Mike001

Ответы:

7

В итоге мы решили добавить прокси-сервер аутентификации между клиентом OpenLayers и бэкэнд-сервисом WMS. Таким образом, вместо непосредственного подключения к службе WMS клиент OpenLayers подключается к прокси-серверу, который добавляет необходимые заголовки аутентификации к запросам.

Пример кода для создания слоев:

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

Пример конфигурации прокси-сервера 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

Вы можете иметь несколько конфигураций прокси, используя этот стиль.

То, что вы должны поместить в кавычки Авторизации, это просто кодировка base-64 строки «username: password» (без кавычек). Для получения дополнительной информации см. Эту ссылку: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t

iluwatar
источник
5

Вы можете отправить поддельный запрос ajax перед добавлением слоя на карту. Браузер будет обрабатывать базовую аутентификацию для вас:

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

});

Это будет работать только в том случае, если сервер вернет требуемый заголовок 401 - auth (в геосервере вы должны установить политику безопасности как сложную или смешанную)

Томмазо
источник
Идентификатор вызова ajax выполнен с использованием jQuery ...
Томмазо
Я хотел бы знать, где именно мне нужно это разместить. В своем проекте я использую GeoExt2, ExtJS 4.2 и OpenLayers 2.12.
g07kore
Я думаю, что это может работать в моем случае. Но есть ли у вас какие-либо предложения, как я могу отправить поддельный запрос? Я использую href со ссылкой на запрос, чтобы вызвать всплывающее окно входа в систему, но я не хочу переходить по ссылке.
geogrow