8

すべてのページでログイン情報が必要なシステムを構築しています。このアプリケーションは、 Phil Sturgeonライブラリとして codeigniter を使用する Restful アプリケーションになるように設計されています。このライブラリは、API キーのみを使用して、HTTPS 接続を介したすべてのリクエストで送信することにより、API 呼び出しを承認します。

双方向認証または API キーのみを使用している場合でも。私がしばらく探しているのは、次のシナリオです。

  • ユーザーが初めてアプリケーションを要求すると (例: https://www.xyz.com )、資格情報を確認するためにログイン ページにリダイレクトされます。
  • ユーザーはユーザー名/パスワードを入力し、https 経由で POST 経由で送信しました
  • サーバーは、情報が有効かどうかを確認します。

    • API KEY は、このユーザー名で識別されるリソースとして、サーバーからクライアントに提供する必要があります (ここで質問です???!!! )

    • API キーを安全な方法でクライアントに送信する方法は?

      • 1)セッション Cookie を使用して API KEY を Cookie に復元し、今後のすべてのリクエストでこの API KEY を使用できますか?
      • 2)実際、私は他のオプションを知りません :) あなたが助けてくれるなら、あなたの番です

たくさんの記事を見つけて読んだので、例を挙げていただければ非常に助かります

:)

4

1 に答える 1

9

接続は HTTPS であるため、ネットワーク経由で送信するものはすべて安全です (理論上、また、攻撃を受けていなければ)。API全体がHTTPS経由で提供されているかどうか(指定しなかった)がわからないため、ログインの一部としてキーを返すことができても(まだHTTPSの傘下にあります)、残りのAPIがそうでない場合HTTPS の場合、キーは次のリクエストで傍受される可能性があります。

通常、セッションと Cookie は RESTful アプリケーションの一部ではありません。REST はステートレスです。

HTTPS 以外の場合は、リボルビング キーのようなものが適しています (HTTPS でも機能します)。HTTPS経由でログインすると、サーバーがAPIキーを返し、次のリクエストでそれを使用し、サーバーが新しいAPIキーを返し、次のリクエストでそれを使用します。HTTPS 以外の単一の API キーよりは優れていますが、完全ではありません。誰かが後続のリクエストの 1 つからのレスポンスを傍受し、あなたがそのキーを最終的に消費しない場合、彼らはそれを使用できます。クライアントからサーバーへのリクエストが傍受された場合、API キーは正当なリクエストによって既に消費されているため、これにより攻撃ベクトルがサーバーからクライアントへの非 HTTPS 応答に縮小されます。ただし、HTTPS 経由で提供していない場合は、API を保護するためにさらに多くのことを行う必要があります。

私だったら、リクエスト署名 + https を調べます。ここにリクエスト署名の話があります: https://stackoverflow.com/a/8567909/183254

http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/のSecuring the APIセクションには、ダイジェスト認証に関する情報もあります。

クライアント上の js 関数の疑似コード例

function get_calendar(){
    var key = $('#api_key').value();
    $.ajax({
        type: 'get',
        url: '/index.php/api/calendar?key=' + key,
        success: function(response){
            // show calendar
            // ...
            // set received api key in hidden field with id api_key
            $('#api_key').value(response.api_key)
        }
    })
}

コントローラーメソッドの例:

function calendar_get($api_key = ''){
    if($api_key_matches){//verify incoming api key
        $r = array();
        $r['calendar'] = $this->some_model->get_calendar();
        $r['api_key'] = $this->_generate_api_key();// generate or get api key
     }
     $this->response($r);
}
于 2013-06-28T18:11:30.200 に答える