3

映画など、多くの情報を含む Web サイト用の API を作成しています。一定数のリクエストを許可したい。たとえば、5$ プランでは、1 か月あたり 10,000 件のリクエストが許可されます。ユーザーはサインアップして API キーを取得し、次のようなリクエストを行うことができます

http://website.com/index.php?api_key=API_KEY&movie=Titanic

サーバーは で答えを返しますjson。私の質問は、この API_KEY をそのユーザーだけが使用できるようにするにはどうすればよいですか? 彼が AJAX リクエストを行うと、他の誰かが API_KEY とのリンクを見て、それを彼のプロジェクトに使用できるからです。そして、AJAX リクエストを許可したい。

4

8 に答える 8

4

それを保持する人は誰でもAPI_KEY「そのユーザー」と見なす必要があるため、「アトミック」リクエストを保持したい場合(api_key各リクエストの一部であり、リクエストは前のリクエストに依存する必要はありません)、実際にはあまりできませんそれについて。ただし、前述の「原子性」を取り除くことにより、API の動作方法を変更する別のアプローチを試すことができます。session_keyそのモデルでは、の代わりに任意の api メソッドを呼び出す必要があり、一時的な生成にのみ使用する必要がapi_keyあります( API の場合は、そこにあるメソッドと言ってください)。それ以降のすべての呼び出しでは、session_keyが返される必要があります。その場合、単一の 、つまりapi_key session_keyloginloginloginapi_keyloginと呼ばれます。

于 2013-08-20T12:39:52.087 に答える
2

API キーが何らかの形でクライアントに表示される場合、そのページにアクセスするユーザーは、コードを検査するのに十分な「パワー ユーザー」である限り、API ユーザーに代わってリクエストを行うこともできます。 HTTP リクエスト。暗号化を行っているかどうかに関係なく、URL、Cookie などでキーを受け入れるかどうか...これらの他の方法は少し不便かもしれませんが、API キーの検索を開始するのに十分な知識があるユーザーは、 Fiddlerなどについて聞いたことがあります。

これがまさに、API が通常、JavaScript (つまり AJAX) で使用できるようにせず、リクエストを送信するためだけに使用できる理由です。サーバーがリクエストを作成するため、API キーを公開する必要はありません。そのユーザーはそのように。

AJAX が API を使用できないようにする以外に、これに対する解決策はまったくありません。AJAX アクセスを許可する必要がある唯一の種類の API は、公開されている API (「ログイン不要」など) であり、代わりに N 時間で N 量のリクエストを行う IP によってのみ制限されます。

于 2013-08-26T13:53:04.123 に答える
1

すべてのデータを URL に格納する代わりに、POST メソッドを使用して、すべてのデータをバックグラウンドで送信してください。次に、ページ間 (非表示フィールドを使用) またはセッションを使用して、ID やその他のデータを投稿できます。

于 2013-08-23T22:32:12.143 に答える
1

100% 完璧なソリューションではないかもしれませんが、特定の映画ビジネスの例ではうまくいくはずです。

まず、各ユーザーにユーザー名とパスワードを与えます。

AJAX 呼び出しを行うために、ユーザーは 3 つのことを指定する必要があります。

  1. ユーザー名
  2. 希望の映画ID
  3. API_KEY

これで、API_KEY は以下に基づいて生成されるハッシュ (sha1()またはmd5()それらの組み合わせを使用できます) になります。

  • ユーザーのパスワード
  • 希望の映画ID
  • 今日の日付

したがって、AJAX リクエストを行うためにユーザーが行う必要がある操作は次のとおりです。

$username = 'john_smith';
$password = 'abc';
$movie_id = 'Titanic';
$date = date('Y-m-d');

$API_KEY = sha1($password . $movie_id . $date);

AJAX("http://website.com/index.php?user=$user_name&movie=$movie_id&api_key=$API_KEY");

(ユーザーがクライアント側の環境しか持たないと予想される場合は、JavaScript でも同様のことができます。)

あなたの側では、次のようにする必要があります。ユーザー名がわかれば、データベースでパスワードがわかります。リクエストから movie_id を取得します。そして今日の日付は私たち全員が知っています。(タイムゾーンの問題を避けるために、昨日と明日を確認することもできます。)

次に、同じハッシュを生成し、ユーザーが送信した API_KEY と比較します。それらが一致する場合 - すべて良い。

このようにして、1 つの映画に対してのみ有効で、約 1 日で有効期限が切れる固有の AJAX 呼び出しが作成されます。

少なくともビジネス的には、それはかなり効率的なアプローチだと思います。

于 2013-08-23T15:08:30.140 に答える
1

(事実上公開されている) API キーだけを使用することはできません。必要なのは、秘密鍵による暗号化認証です。クライアント側の証明書を使用したTLSはそれを行う必要があります。

于 2013-08-20T12:42:22.303 に答える
0

本当に安全が必要な場合は、Oauth認証を使用してください(あなたの場合は2足のバリアント)。もちろん、他の著者が提案したように、HMAC 認証または鍵交換を使用することもできますが、独自のプロトコルを発明するのではなく、既存の検証済みのプロトコルを使用することを常にお勧めします。

見る:

于 2013-08-29T23:57:47.703 に答える