OpenLayers 2.12和HTTP基本身份验证问题


13

我正在尝试使用OpenLayers 2.12从启用了HTTP基本身份验证的服务器上显示WMS图层。

我试图通过将用户名和密码放在我的JavaScript代码的URL参数中来处理身份验证。图层创建示例:

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中,身份验证似乎完美无缺。

您是否可以通过将其编码为URL并将其提供给OpenLayers来确认无法以跨浏览器的方式处理HTTP基本身份验证?

您能否建议其他方法来处理HTTP基本身份验证,以使其对用户透明(不显示身份验证弹出窗口)?也许使用某种代理服务器来解决此问题。



据我所知,在OpenLayers中处理身份验证的唯一方法是使用函数OpenLayers.Request.issue()(goo.gl/OKtGj),它不符合您的需求。
dariapra 2012年

iluwatar>您是否曾经遇到过FireFox显示登录身份验证的问题?在编写时,您只需在弹出窗口上按“取消”即可,但是对于最终用户使用身份验证弹出窗口来说,这是令人不安的和困惑的。
Mike001 2013年

Answers:


7

我们最终得到的解决方案是在OpenLayers客户端和后端WMS服务之间添加身份验证代理服务器。因此,OpenLayers客户端不是直接连接到WMS服务,而是连接到代理服务器,该代理服务器将所需的身份验证标头添加到请求中。

用于创建图层的示例代码:

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

您可以使用此样式进行多个代理配置。

您应该在授权引号中放入的只是字符串“ username:password”(不带引号)的base-64编码。有关更多信息,请参见以下链接:https : //stackoverflow.com/questions/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 required标头时,此方法才有效(在geoserver中,您必须将安全策略设置为质询或混合)


使用jQuery完成的ajax呼叫ID ...
Tommaso 2012年

我很想知道我到底该放在哪里。在我的项目中,我正在使用GeoExt2,ExtJS 4.2和OpenLayers 2.12。
g07kore 2015年

我认为这可以解决我的问题。但是您有什么建议可以发送假请求吗?Atm我使用带有指向请求的链接的href来触发登录弹出窗口,但我不想导航到该链接。
geogrow
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.