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では、認証は問題なく動作するようです。

HTTPベーシック認証を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)関数を使用することです。これはニーズに合っていません。
ダリアプラ

iluwatar> FireFoxがログイン認証を表示するという問題を克服したことはありますか?あなたが書いているように、ポップアップでキャンセルを押すことができますが、認証ポップアップでエンドユーザーを混乱させ、混乱させます。
Mike001

回答:


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

このスタイルを使用して、複数のプロキシ構成を設定できます。

Authorization引用符の中に置くべきなのは、文字列 "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 headerを返す場合にのみ機能します(ジオサーバーでは、チャレンジまたは混合にセキュリティポリシーを設定する必要があります)


jQueryのを使用して行わAJAX呼び出しのID ...
トンマーゾ

正確にどこに配置する必要があるかを知りたいです。私のプロジェクトでは、GeoExt2、ExtJS 4.2、およびOpenLayers 2.12を使用しています。
-g07kore

私の場合、これでうまくいくと思う。しかし、私は偽のリクエストを送信する方法を提案していますか?ATMリクエストへのリンクでhrefを使用してログインポップアップをトリガーしますが、リンクに移動したくありません。
geogrow
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.