29

codeigniter の phil sturgeon REST_Controller を使用して REST API を作成しています。これまでのところ、ユーザーの API キーを生成するための単純なライブラリを作成できました。私の問題は、リクエストごとにAPIキーをAPIに送信することです.リクエストごとに手動で送信する必要はありません。

4

2 に答える 2

54

リクエストの署名を検討する必要があります。良い例は、Amazon の S3 REST APIです。

概要は実際には非常に簡単です。ユーザーは、API を使用するための 2 つの重要な情報 (パブリック ユーザー ID とプライベート API キー) を持っています。リクエストとともに公開 ID を送信し、秘密鍵を使用してリクエストに署名します。受信サーバーはユーザーのキーを検索し、署名された要求が有効かどうかを判断します。流れは次のようなものです。

  1. ユーザーがサービスに参加し、ユーザー ID (例: 123) と API キーを取得します。
  2. ユーザーは、API サービスにリクエストを送信してメール アドレスを更新したいと考えているため、API にリクエストを送信する必要があります /user/update?email=new@example.com
  3. リクエストを検証できるようにするために、ユーザーはユーザー ID と署名を呼び出しに追加するため、呼び出しは次のようになります。 /user/update?email=new@example.com&userid=123&sig=some_generated_string
  4. サーバーは呼び出しを受信し、それが userid=123 からのものであることを確認し、そのユーザーの API キーを検索します。次に、データから署名を作成する手順を複製し、署名が一致する場合、要求は有効です。

この方法により、API キーが通信の一部として送信されることはありません

PHP のhash_hmac()関数を見てみましょう。これは、署名付きのリクエストを送信するのに人気があります。一般に、すべてのパラメーターを配列に入れ、アルファベット順に並べ替え、文字列に連結し、hash_hmacその文字列を取得してsigを取得するなどの操作をユーザーに実行させます。この例では、次のようにします。

$sig = hash_hmac("sha256",$params['email'].$params['userid'],$API_KEY)

$sig次に、上記のように REST URL に追加します。

于 2011-12-19T21:39:16.800 に答える
6

RESTの考え方は、ステートレスであるため、セッションなどがないということです。認証したい場合は、ここでキーが入力され、すべてのリクエストに対してキーを渡す必要があり、各リクエストはユーザーを認証します(RESTはステートレスなので、私はそれについて言及しましたか?)。

キーを渡すにはさまざまな方法があります。これをパラメーターとして渡すことも(つまり、http://example.com/api/resource/id ?key = api_key )、HTTPヘッダーの一部として渡すこともできます。ユーザー名を送信するように指定するAPIと、HTTP基本アクセス認証ヘッダーのパスワード部分としてAPIキーを見てきました。

リクエストの例:

<?php

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => 'http://example.com/api/resource/id',
    CURLOPT_USERPWD => 'martinbean:4eefab4111b2a'
));
$response = curl_exec($ch);

martinbeanあなたのウェブサイトの私のアカウントのユーザー名はどこにあり4eefab4111b2a、私のAPIキーになります。

于 2011-12-19T21:24:25.587 に答える