28

JQueryを使用して通信しようとしているRESTベースのサーバーがあります。 XMLとJSONの両方をレスポンス形式として利用できるため、JSONを使用しています。JQuery AjaxがHTTP基本認証で呼び出す

HTTP基本認証を選択した私たちの認証方式となっている、と私たちは他のフロントエンドには問題ありませんでしたしているので、接続がすべてSSLある(生のJavascript、シルバー、など...)

今、私がしようとしていますJQueryと一緒に何かを入れ、HTTP基本認証を使用して無限の問題を抱えています。

私は多くの前回の質問の多くは、実際に動作していないか、または基本的なJavascriptテストですでに克服しているクロスオリジンアクセスの問題全体を責めているソリューションを持っています。応答では、要求の中で提供されたOriginヘッダーに常にAccess-Control-Allow-Originが設定されています。これは私のテストの応答で見ることができます。基本的なJavaScriptで

は、この全体の呼び出しは非常に単純で達成される:

req.open('GET', 'https://researchdev-vm:8111/card', true, 'test', 'testpassword'); 

この時はJQueryの試みはかなり標準的である:

 $.ajax({ 
     username: 'test', 
     password: 'testpassword', 
     url: 'https://researchdev-vm:8111/card', 
     type: 'GET', 
     dataType: 'json', 
     crossDomain: true, 
     /*data: { username: 'test', password: 'testpassword' },*/ 
     beforeSend: function(xhr){ 
      xhr.setRequestHeader("Authorization", 
       //"Basic " + encodeBase64(username + ":" + password)); 
       "Basic AAAAAAAAAAAAAAAAAAA="); 
     }, 
     sucess: function(result) { 
      out('done'); 
     } 
    }); 

実際に提供するために動作するようです唯一の方法認証は、beforeSend()関数でBase64でエンコードされたデータを直接挿入することです。これが含まれていない場合は、何も進展がありません。ユーザー名とパスワードのプロパティは完全に無視されるようです。

beforeSend()ビヘイビアが指定されている場合、GETコールはデータを含む肯定応答を返します。ただし、これはクロスサイトコールなので、OPTIONS呼び出しはGET呼び出しより先に実行され、beforeSend()を使用しないため、失敗した認証のために401応答を取得するため、常に失敗します。

非常に簡単な呼び出しを行うには、より良い方法がありますか? OPTIONS要求がbeforeSend()関数の処理を利用しないという事実はバグとみなされるべきですか?おそらくOPTIONSチェックを完全に無効にする方法はありますか? Javascriptは「クロスサイト」と同じマシン上の異なるポート番号を考慮しているように見えるので、この呼び出しをクロスサイトではできません。

+0

あなたが前に送信し、ユーザー名/パスワードのフィールドを持っている必要はありません。あなたの$ .ajax関数からユーザー名/パスワードフィールドを削除します。 –

答えて

1

AJAX呼び出しのパススルー認証として機能するものがあります。これは、NTLMに依存して、JavaScriptが実行されるページで認証します。多分これはあなたを助ける:

PHPコード:この質問は

var xml = new XMLHttpRequest(); 
xml.open('GET', './somePage.php', true); 
xml.setRequestHeader('Authorization', auth); // <<<<----- USED HERE 
xml.send(); 
+0

'auth'変数がどのように表示されるかの例を提供した場合は役に立ちます。私はそれがユーザーとパスワードのプロパティを持つオブジェクトだと思いますが、そのことについては明示するのが最善でしょう – TKoL

+0

@TKoL OPは 'auth'値の例を提供します。基本的には、 '' Basic "+ encodeBase64(username +": "+ password));' –

+0

ありがとう@ wes.hysellです。それはわかりませんでした。 – TKoL

3

:標準のXMLHttpRequestのために

$.ajax({ 
     type: 'POST', 
     url: './somePage.php', 
     data: {"test":true}, 
     dataType: 'json', 
     success: function(data) { 
      console.log(data.username); 
     }, 
     beforeSend : function(req) { 
      req.setRequestHeader('Authorization', auth); // <<<<----- USED HERE 
     }, 
}); 

:jQueryのを使用して

<?php 
$headers = apache_request_headers(); 
if (isset($headers['Authorization'])) 
    echo "<script>var auth = " . $headers['Authorization'] . "</script>"; 
unset($headers); 
?> 

をあなたはこのようにそれを使用しますおそらくその有効期限を過ぎてしまったのですが、私はJqueryで同じことをしていて、 ameの問題。

通常、HTTP基本認証を実行するのと同じように、usernameおよびpassword属性は、u​​sername/passwordのbase64エンコードを行っていないようです。beforeSend方法と

Request URL:http://testuser%40omnisoft.com:[email protected]:60023/Account 
Request Method:GET 
Accept:application/json, text/javascript, */*; q=0.01 
Host:localhost:60023 

そして今:

Request URL:http://localhost:60023/Account 
Request Method:GET 
Accept:application/json, text/javascript, */*; q=0.01 
Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ= 
Host:localhost:60023 
まずjQueryのAJAXの方法では、「ユーザ名」と「パスワード」パラメータを使用して、次のリクエスト(簡潔にするために短縮)で

見て、

第1の方法は、要求の「認可」ヘッダを含み、その代わりに、ターゲットURLのプレフィックスないことに注意してください。私はHTTPの基本認証について専門家はいませんが、それは前者が適切な実装ではないことを示し、したがって失敗します(または少なくとも自分自身のサーバー実装では失敗します)。

JSONPを使用したOPTIONSリクエストについては、crossdomainオプションを使用する代わりに、URLに?callback=?を明示的に使用することができます。この問題から入る人のため

1

は、私は、ApacheとOPTIONS要求をインターセプトし、唯一のGETおよびバックエンドへのPOST転送問題を解決してきました。

このソリューションは、アプリケーションサーバーに依存しているため、同様にPHPとJavaの作品:

<VirtualHost *:80> 

    # ServerName and other configuration... 


    # CORS 
    Header set Access-Control-Allow-Origin "*" 
    Header set Access-Control-Allow-Methods "OPTIONS, GET, PUT, POST" 
    Header set Access-Control-Allow-Headers "Authorization" 

    # Intercept OPTIONS calls 
    RewriteEngine On 
    RewriteCond %{REQUEST_METHOD} ^(OPTIONS)$ 
    RewriteRule .* - [L] 

    # Backend, adapt this line to fit your needs 
    RewriteRule /(.*) ajp://localhost:8010/$1 [L,P] 

</VirtualHost> 

よろしく、 マウリツィオ

+0

適切なREST実装のためには、おそらく 'PUT'メソッドも含めることになります。 –

+0

defintely、ありがとうJezen! – Maurix

関連する問題