11

安全な .net サーバーと通信する PhoneGap アプリケーションを開発しています。問題は、リクエスト ( W3C )で Cookie を渡すことができないように見えることです。

これが私がやっていることです(「ユーザー名」と「パスワード」が機能すると仮定します)。

var token;    
$.ajax({
        url: "https://server.com/AuthService/api/account/login",
        crossDomain: true,
        type: 'post',
        async: false,
        data: {
            username: "username",
            password: "password"
        }
    }).done(function(response) {
        token = response.securityToken;
        success = true;
    });

この時点で、後続のすべてのリクエストを検証するために使用できる認証トークンが得られました。そのトークンを使用して、サーバーに別のリクエストを行います...

$.ajax({
    url: "https://server.com/Service/api/search?query=" + query,
    headers: { Cookie: 'auth=' + token },
    crossDomain: true,
    withCredentials: true,
    type: 'POST',
    async: false,
    data: ' ' //because we don't want our request to be 0 bytes (the server is picky)
}).done(function(data) {
    result = data;
});

Chrome は次のように言っています: 安全でないヘッダー「Cookie」の設定を拒否しました (これは W3C 仕様に準拠しています)。アプリはヘッダーを設定せず、その結果、承認 Cookie が送信されないため、リクエストは 401 になります。

私の質問はこれです: PhoneGap でこれを覆して Cookie ヘッダー (またはそれを完全に処理する別の方法) をオーバーライドする方法はありますか? Authorizationヘッダーを使用することもオプションであることは知っていますが、サーバーへのアクセスが制限されており(サポートされていません)、より迅速な解決策を望んでいました.

おまけの質問: AuthService への呼び出しは、デバイスに httpOnly Cookie も設定する必要がありますが、そうではありません (これはクロスドメイン要求であるためだと推測します)... この仮定で正しいでしょうか、それとも何か問題がある可能性がありますサーバ側?

ありがとう!

4

1 に答える 1

6

Cookie ヘッダーを設定することはできません。これは、Chrome がユーザー エージェントであるため、HTTP 仕様では、セキュリティに影響するヘッダーの変更を禁止する必要があるためです。

1 つの解決策は、サーバーが XmlHttpRequest オブジェクトに Cookie を設定できるようにするアクションを実行することです。あなたはすでにこれをやろうとしていると言いますが、うまくいきません。これは、ajax リクエストで withCredentials を設定する必要があるためだと思われます。次のように xhrFields 属性を追加します。

var token;    
$.ajax({
    url: "https://server.com/AuthService/api/account/login",
    crossDomain: true,
    xhrFields: {withCredentials: true},
    type: 'post',
    async: false,
    data: {
        username: "username",
        password: "password"
    }
}).done(function(response) {
    token = response.securityToken;
    success = true;
});

これで、応答サーバーが CORS 許可ドメイン (Access-Control-Allow-Origin) としてワイルドカードを送信しない限り、Cookie を受け取るはずです。

于 2014-02-03T21:10:48.667 に答える