OpenLayers 2.12 và http xác thực tai ương


13

Tôi đang cố gắng sử dụng OpenLayers 2.12 để hiển thị các lớp WMS từ máy chủ có bật Xác thực cơ bản HTTP.

Tôi đã cố gắng xử lý xác thực bằng cách đặt tên người dùng và mật khẩu vào tham số URL trong mã JavaScript của mình. Tạo lớp ví dụ:

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

Tất nhiên điều này không an toàn vì thông tin đăng nhập được lưu trữ trong mã JavaScript và không hoạt động trong tất cả các trình duyệt. Internet Explorer 8 cung cấp lỗi bảo mật trỏ đến OpenLayers.js và từ chối hiển thị bản đồ. Firefox 13 bật lên một số hộp thoại xác thực mà tôi có thể hủy (bản đồ sẽ hiển thị chính xác sau đó). Trong Chrome 23, xác thực dường như hoạt động hoàn hảo.

Bạn có thể xác nhận rằng không thể xử lý xác thực cơ bản HTTP theo cách đa trình duyệt bằng cách mã hóa nó trong URL và đưa nó cho OpenLayers như trong ví dụ không?

Bạn có thể đề xuất các cách khác để xử lý xác thực cơ bản HTTP để nó hoạt động minh bạch cho người dùng (không có cửa sổ bật lên xác thực nào được hiển thị) không? Có lẽ sử dụng một số loại máy chủ proxy để làm việc này.


2
Bạn có thể sử dụng Proxy - docs.openlayers.org/l Library / revest.html ví dụ proxy> collab.itc.virginia.edu/wiki/toolbox/
Mapperz

Theo tôi biết, cách duy nhất để xử lý xác thực trong OpenLayers là sử dụng chức năng OpenLayers.Request.su () ( goo.gl/OKtGj ), không phù hợp với nhu cầu của bạn.
dariapra

iluwatar> Bạn đã bao giờ vượt qua vấn đề FireFox hiển thị xác thực đăng nhập chưa? Khi bạn viết, bạn chỉ có thể nhấn hủy trên cửa sổ bật lên, nhưng nó gây phiền nhiễu và khó hiểu cho người dùng cuối với cửa sổ bật lên xác thực.
Mike001

Câu trả lời:


7

Giải pháp chúng tôi đã kết thúc là thêm một máy chủ proxy xác thực giữa máy khách OpenLayers và dịch vụ WMS phụ trợ. Vì vậy, thay vì kết nối trực tiếp với dịch vụ WMS, máy khách OpenLayers kết nối với máy chủ proxy có thêm các tiêu đề xác thực được yêu cầu cho các yêu cầu.

Mã ví dụ để tạo các lớp:

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

Ví dụ cấu hình proxy 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

Bạn có thể có nhiều cấu hình proxy bằng cách sử dụng kiểu này.

Những gì bạn nên đặt bên trong các trích dẫn Ủy quyền chỉ là mã hóa cơ sở 64 của chuỗi "tên người dùng: mật khẩu" (không có dấu ngoặc kép). Để biết thêm thông tin, hãy xem liên kết này: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to- leather-t


5

Bạn có thể gửi yêu cầu ajax giả trước khi thêm lớp vào bản đồ. Trình duyệt sẽ xử lý xác thực cơ bản cho bạn:

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

});

Điều này sẽ chỉ hoạt động nếu máy chủ trả về tiêu đề bắt buộc 401 - auth (trong máy chủ địa lý, bạn phải đặt chính sách bảo mật thành thách thức hoặc hỗn hợp)


Id cuộc gọi ajax được thực hiện bằng jQuery ...
Tommaso

Tôi rất muốn biết chính xác nơi tôi cần đặt nó. Trong dự án của tôi, tôi đang sử dụng GeoExt2, ExtJS 4.2 và OpenLayers 2.12.
g07kore

Tôi nghĩ rằng điều này có thể làm việc trong trường hợp của tôi. Nhưng bạn có bất cứ đề nghị làm thế nào tôi có thể gửi một yêu cầu giả mạo? Tôi sử dụng a href với liên kết đến yêu cầu để kích hoạt cửa sổ bật lên đăng nhập, nhưng tôi không muốn điều hướng đến liên kết.
geogrow
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.