OpenLayers 2.12 및 http 기본 인증 문제


13

HTTP 기본 인증이 활성화 된 서버에서 OpenLayers 2.12를 사용하여 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 기본 인증을 처리하여 사용자에게 투명하게 작동하도록 인증 방법이 표시되지 않는 다른 방법을 제안 할 수 있습니까? 아마도이 문제를 해결하기 위해 일종의 프록시 서버를 사용할 것입니다.


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 2019

답변:


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 : //.com/questions/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t


5

레이어를 맵에 추가하기 전에 가짜 아약스 요청을 보낼 수 있습니다. 브라우저가 기본 인증을 처리합니다.

// 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 헤더를 반환하는 경우에만 작동합니다 (지오 서버에서 보안 정책을 시도하거나 혼합하도록 설정해야 함)


jQuery를 사용하여 수행 된 Ajax 호출 ID ...
Tommaso

정확히 어디에 배치해야하는지 알고 싶습니다. 내 프로젝트에서 GeoExt2, ExtJS 4.2 및 OpenLayers 2.12를 사용하고 있습니다.
g07kore

내 경우에는 이것이 효과가 있다고 생각합니다. 하지만 가짜 요청을 보내는 방법에 대한 제안이 있습니까? Atm 로그인 팝업을 트리거하는 요청에 대한 링크와 함께 href를 사용하지만 링크로 이동하고 싶지 않습니다.
geogrow
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.