0

モバイルアプリがそれと通信できるようにするPHPApiを構築しています。このアプリは、現時点では技術とアイデアをテストするための技術デモです。

アプリのリクエストを保護するには、特定のものに認証が必要になります。

たとえば、次のようにしましょう。

$('form').submit(function(e){

    e.preventDefault();

    var form = $(this);

    var data = form.serialize();

    $.ajax({
        type: 'POST',
        url: form.attr('action'),
        data: data,
        success: function(response){

            // show success message or error depending on authentication

        },
        error: function(a,b,c) {

        }   
    });

});

また、アプリがアプリと通信できるようにするためにも使用header('Access-Control-Allow-Origin: *');しています。ワイルドカードは、現時点ではテストにすぎないためです。ただし、実際の状況では、ドメインは別のドメイン(おそらくPhoneGap)ではなくモバイルデバイスから実行されるため、ドメインはありません。

ネットを見て回ったのHTTP Authorizationですが、いくつドキュメントを読んでも頭がおかしくなりません。

その例は次のようになります。

Authorization: TRUEREST username=john&password=test&apikey=247b5a2f72df375279573f2746686daa

そして、jQueryドキュメントで見たものに基づいて、そのようなデータを渡すことを考えました。

data: {
    username: 'john',
    password: 'test',
    apiKey: '247b5a2f72df375279573f2746686daa'
},
headers: {
    Authorization: "TRUEREST"
},

JSONを返送する前に、まずユーザー名とパスワードがDBに存在することを確認し、おそらく同じ方法でApiキーを確認することもできます。 ?

アップデート

私はjQueryコードで次のことを試しています:

headers: {
                            Authorization: "TRUEREST",
                            username: 'dave',
                            password: 'test',
                            apiKey: 'qwe123'    
                        },

そして私のPHPでは:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Authorization,Content-type,username,password,apiKey');

if($_SERVER['REQUEST_METHOD'] == 'POST')
{


    $headers = $_SERVER['HTTP_AUTHORIZATION'];
    $parts = explode(' ', $_SERVER['HTTP_AUTHORIZATION']);

    header('Content-type: application/json');
    print json_encode($parts);

    exit;

返されるJSONはTRUERESTです!他のどれもPHPによって見られていません。しかし、私がWebインスペクターを見ると、問題なく送信されています。しかし、POSTとOPTIONSの2種類のリクエストが行われていることに注意してください。

何か案は?

これらの更新は、ここで読んだ内容に基づいています:https ://github.com/kvz/cakephp-rest-plugin/blob/master/Controller/Component/RestComponent.php#L516

4

1 に答える 1

2

まず、PhoneGapアプリのクロスドメイン制限について心配する必要はありません。

同一生成元ルールを適用するのはブラウザであることを忘れないでください。サーバーが関与する可能性があるのは、別のドメインのページがサーバー上の何かに対してXHRリクエストを作成しようとする場合だけです。CORS仕様は、それがどのように処理されるかを概説しています。適切なAccess-Control-Allow-Originヘッダーで応答する場合、XHRリクエストは無制限に許可されます。

したがって、PhoneGapには、同一生成元ルールを適用するブラウザーはなく、PhoneGapの構成(ユーザーが制御する)のみが適用されます。PhoneGapを使用すると、アプリがアクセスできるドメイン(またはすべて)を指定できます。ホワイトリストに登録されると、コードは制限なしでそれらのドメインにXHRリクエストを送信できるようになります。

唯一の厄介な点は、jQueryを使用してXHRリクエストを作成するときに、同じオリジンのルールを回避する必要があると誤って想定して、リクエストをJSONPに変換しようとすることです。

これを修正するには、jQueryに常にXHRを使用させることができます。

$.ajaxSetup({crossDomain:false});

に関してAuthorizationは、それはかなり簡単です。クライアントは、文字列リテラルBasic、スペース、ユーザー名、コロン、およびbase64でエンコードされたパスワードを送信します。

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

base64データをデコードすると、が生成されAladdin:open sesameます。


追加したjQueryスニペットに基づくと、HTTPリクエストは次のようになります。

POST /form.php HTTP/1.1
Host: example.com
X-Requested-With: XmlHttpRequest
Authorization: TRUEREST
username: dave
password: test
apiKey: qwe123
...

$_SERVER['HTTP_AUTHORIZATION']含まれている理由は明らかTRUERESTです。他の項目は完全に別個の(そして無効な)ヘッダーです。試す:

headers: {
    Authorization: 'X-My-API ' + $.param({
        username: 'dave',
        password: 'test',
        apiKey: 'qwe123'
    })
}

これで、リクエストは次のようになります。

POST /form.php HTTP/1.1
Host: example.com
X-Requested-With: XmlHttpRequest
Authorization: X-My-API username=dave&password=test&apiKey=qwe123
...
  • $.paramオブジェクトをURLエンコードされたクエリ文字列にシリアル化します。
  • HTTP基本認証と同様に、認証データのbase64エンコードを検討する必要があります。これにより、[A-Za-z0-9 + / =](印刷可能)文字のみがHTTPヘッダーに含まれるようになり、セキュリティの問題を回避できる可能性があります。
  • RFCの要件については完全には明確ではありませんが、慣例により、HTTPの非標準の拡張機能には通常X-のプレフィックスが付いています。承認スキームは非標準であるため、同じことを行う必要があります。
  • 表示されているOPTIONSリクエストは、CORSが機能しています。Access-Control-Allow-OriginクロスドメインXHRリクエストでカスタムヘッダーを指定すると、ブラウザは最初にサーバーに問い合わせて、サーバーが応答としてヘッダーを送信するかどうかを確認します( 「プリフライトリクエスト」)。その場合にのみ、ブラウザは実際のPOSTデータを送信します。
于 2013-01-29T22:18:54.263 に答える