OpenLayers 2.12 ve http temel kimlik doğrulama sorunları


13

HTTP Temel Kimlik Doğrulaması etkin olan bir sunucudan WMS katmanlarını görüntülemek için OpenLayers 2.12 kullanmaya çalışıyorum.

JavaScript kodumdaki URL parametresine kullanıcı adı ve parolayı koyarak kimlik doğrulamasını işlemeye çalıştım. Örnek katman oluşturma:

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

Elbette bu güvenli değildir, çünkü kimlik bilgileri JavaScript kodunda saklanır ve tüm tarayıcılarda çalışmaz. Internet Explorer 8, OpenLayers.js'ye işaret eden güvenlik hatası veriyor ve haritayı hiç görüntülemeyi reddediyor. Firefox 13, iptal edebileceğim bazı kimlik doğrulama iletişim kutularını açar (harita bundan sonra doğru bir şekilde görüntülenir). Chrome 23'te kimlik doğrulama sorunsuz çalışıyor gibi görünüyor.

URL'de kodlayarak ve örnekteki gibi OpenLayers'a vererek HTTP temel kimlik doğrulamasının tarayıcılar arası bir şekilde ele alınmasının mümkün olmadığını doğrulayabilir misiniz?

HTTP temel kimlik doğrulamasını kullanıcı için şeffaf bir şekilde çalışacak şekilde işlemek için alternatif yollar önerebilir misiniz (kimlik doğrulama açılır penceresi görüntülenmez)? Bu soruna geçici bir çözüm bulmak için bir çeşit proxy sunucusu kullanabilirsiniz.



Bildiğim kadarıyla, OpenLayers'ta kimlik doğrulamayı ele almanın tek yolu, ihtiyaçlarınıza uymayan OpenLayers.Request.issue () ( goo.gl/OKtGj ) işlevini kullanmaktır .
dariapra

iluwatar> FireFox'un bir giriş kimlik doğrulaması göstermesi sorununu hiç aştınız mı? Yazarken, açılır pencerede iptal düğmesine basabilirsiniz, ancak son kullanıcı için kimlik doğrulama açılır penceresini rahatsız edici ve kafa karıştırıcı.
Mike001

Yanıtlar:


7

Sonunda bulduğumuz çözüm, OpenLayers istemcisi ile arka uç WMS hizmeti arasında bir kimlik doğrulama proxy sunucusu eklemekti. Dolayısıyla, doğrudan WMS hizmetine bağlanmak yerine OpenLayers istemcisi, isteklere gerekli kimlik doğrulama başlıklarını ekleyen bir proxy sunucusuna bağlanır.

Katmanları oluşturmak için örnek kod:

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

Apache proxy yapılandırması örneği:

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

Bu stili kullanarak birden fazla proxy yapılandırmanız olabilir.

Yetkilendirme tırnak içine koymanız gereken sadece "kullanıcı adı: şifre" dizesinin base-64 kodlamasıdır (tırnak işaretleri olmadan). Daha fazla bilgi için bu bağlantıya bakın: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t


5

Katmanı haritaya eklemeden önce sahte bir ajax isteği gönderebilirsiniz. Tarayıcı sizin için temel kimlik doğrulamasını yapacaktır:

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

});

Bu yalnızca sunucu 401 - yetkilendirme gerekli bir başlık döndürürse çalışır (geoserver'da güvenlik politikasını zorlanacak veya karışık olarak ayarlamanız gerekir)


Ajax çağrı kimliği jQuery kullanılarak yapıldı ...
Tommaso

Tam olarak nereye yerleştirmem gerektiğini bilmek isterim. Projemde GeoExt2, ExtJS 4.2 ve OpenLayers 2.12 kullanıyorum.
g07kore

Sanırım bu benim durumumda işe yarayabilir. Ama sahte bir istek nasıl gönderebilirim? Atm Giriş açılır penceresini tetiklemek için istek bağlantısı ile bir href kullanın, ancak bağlantıya gitmek istemiyorum.
geogrow
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.