web-dev-qa-db-ja.com

APIキーをREST APIに渡す

Codeigniterのphil sturgeon REST_Controllerを使用してREST apiを作成しています。これまでのところ、ユーザー用のapiキーを生成するための簡単なライブラリを作成できました。各リクエストのAPIのキー、リクエストごとに手動で送信することなくこれを行う方法。

28
MrFoh

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

概要は実際には非常に簡単です。ユーザーには、APIを使用するための2つの重要な情報、パブリックユーザーIDとプライベートAPIキーがあります。彼らはリクエストとともにパブリックIDを送信し、プライベートキーを使用してリクエストに署名します。受信サーバーはユーザーのキーを検索し、署名されたリクエストが有効かどうかを判断します。フローは次のようなものです。

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

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

PHPの hash_hmac() 関数を見てください。これは、署名付きリクエストの送信で人気があります。一般に、ユーザーはすべてのパラメーターを配列に入れ、アルファベット順にソートし、文字列に連結してからhash_hmac署名を取得する文字列。この例では、次のことができます。

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

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

53
zombat

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キーになります。

6
Martin Bean