OpenLayers 2.12 dan http otentikasi dasar menyengsarakan

13

Saya mencoba menggunakan OpenLayers 2.12 untuk menampilkan lapisan WMS dari server yang telah mengaktifkan otentikasi dasar HTTP.

Saya telah mencoba menangani otentikasi dengan memasukkan nama pengguna dan kata sandi dalam parameter URL dalam kode JavaScript saya. Contoh pembuatan layer:

myLayer = new OpenLayers.Layer.WMS('background',
        'https://username:[email protected]/rasteriaineistot/image?',
        {
            layers: 'background',
            bbox: '-380188,6249943,1347312,8226943'
        },                                   
        {
            displayInLayerSwitcher: true,
            isBaseLayer: false,
            projection: 'EPSG:3067',
            visibility: true
        });

Tentu saja ini tidak aman karena kredensial disimpan dalam kode JavaScript dan tidak berfungsi di semua browser. Internet Explorer 8 memberikan kesalahan keamanan yang menunjuk ke OpenLayers.js dan menolak untuk menampilkan peta sama sekali. Firefox 13 memunculkan beberapa dialog otentikasi yang dapat saya batalkan (peta ditampilkan dengan benar setelah itu). Di Chrome 23 otentikasi tampaknya berfungsi dengan sempurna.

Bisakah Anda mengonfirmasi bahwa tidak mungkin untuk menangani otentikasi dasar HTTP dengan cara lintas-peramban dengan menyandikannya di URL dan memberikannya ke OpenLayers seperti dalam contoh ini?

Bisakah Anda menyarankan cara-cara alternatif untuk menangani otentikasi dasar HTTP sehingga bekerja secara transparan kepada pengguna (tidak ada popup otentikasi yang ditampilkan)? Mungkin menggunakan beberapa jenis server proxy untuk mengatasi ini.

iluwatar
sumber
2
Anda dapat menggunakan Proxy - docs.openlayers.org/library/request.html contoh proxy> collab.itc.virginia.edu/wiki/toolbox/…
Mapperz
Sejauh yang saya tahu, satu-satunya cara menangani otentikasi di OpenLayers adalah menggunakan fungsi OpenLayers.Request.issue () ( goo.gl/OKtGj ), yang tidak sesuai dengan kebutuhan Anda.
dariapra
iluwatar> Apakah Anda pernah melewati masalah yang FireFox menunjukkan otentikasi login? Saat Anda menulis, Anda hanya dapat menekan batal pada popup, tetapi itu mengganggu dan membingungkan bagi pengguna akhir dengan popup otentikasi.
Mike001

Jawaban:

7

Solusi yang akhirnya kami tambahkan adalah menambahkan server proxy yang mengotentikasi antara klien OpenLayers dan layanan WMS backend. Jadi alih-alih terhubung langsung ke layanan WMS, klien OpenLayers menghubungkan ke server proxy yang menambahkan header otentikasi yang diperlukan untuk permintaan.

Kode contoh untuk membuat layer:

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

Contoh konfigurasi 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

Anda dapat memiliki beberapa konfigurasi proxy menggunakan gaya ini.

Apa yang harus Anda masukkan ke dalam kutipan Otorisasi hanyalah pengkodean basis-64 dari string "nama pengguna: kata sandi" (tanpa tanda kutip). Untuk informasi lebih lanjut, lihat tautan ini: /programming/567814/apache2-reverse-proxy-to-an-end-point-that-requires-basicauth-but-want-to-hide-t

iluwatar
sumber
5

Anda dapat mengirim permintaan ajax palsu sebelum menambahkan layer ke peta. Browser akan menangani otentikasi dasar untuk Anda:

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

});

Ini hanya akan berfungsi jika server mengembalikan header 401 - auth diperlukan (dalam geoserver Anda harus mengatur kebijakan keamanan untuk menantang atau dicampur)

Tommaso
sumber
Id panggilan ajax dilakukan menggunakan jQuery ...
Tommaso
Saya ingin tahu di mana tepatnya saya perlu menempatkan itu. Dalam proyek saya, saya menggunakan GeoExt2, ExtJS 4.2 dan OpenLayers 2.12.
g07kore
Saya pikir ini bisa berhasil dalam kasus saya. Tetapi apakah Anda punya saran bagaimana saya dapat mengirim permintaan palsu? Saya menggunakan href dengan tautan ke permintaan untuk memicu munculan masuk, tetapi saya tidak ingin menavigasi ke tautan.
geogrow