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, щоб вона прозоро працювала для користувача (не відображаються спливаючі вікна аутентифікації)? Можливо, використовуйте якийсь проксі-сервер, щоб обійти це.


2
Ви можете використовувати проксі - docs.openlayers.org/library/request.html приклад проксі> collab.itc.virginia.edu/wiki/toolbox/…
Mapperz

Наскільки мені відомо, єдиним способом обробки автентифікації в OpenLayers є використання функції OpenLayers.Request.issue () ( goo.gl/OKtGj ), яка не відповідає вашим потребам.
dariapra

iluwatar> Ви коли-небудь стикалися з проблемою, що FireFox показує автентифікацію входу? Коли ви пишете, ви просто можете натиснути скасувати на спливаючому вікні, але це тривожно та заплутано для кінцевого користувача з спливаючим вікном аутентифікації.
Mike001

Відповіді:


7

Рішення, з яким ми закінчилися, було додати автентифікаційний проксі-сервер між клієнтом OpenLayers та сервісом WBS. Отже, замість підключення безпосередньо до сервісу 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 рядка "ім'я користувача: пароль" (без лапок). Для отримання додаткової інформації дивіться це посилання: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t


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

Я думаю, що це могло б спрацювати в моєму випадку. Але у вас є якісь пропозиції, як я можу надіслати підроблений запит? Atm Я використовую href із посиланням на запит, щоб викликати спливаюче вхід, але я не хочу переходити до посилання.
geogrow
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.