ここ数日、REST 認証の基本を独学で学ぼうとして、簡単なアプリケーションのアイデアをいじっていました。
これまでのところ、これを行う最善の方法は、Amazon で使用されているような HMAC の実装を使用することであることがわかりました。
私の最大の関心事は、ユーザーを認証し、HMAC への署名を開始できるように秘密鍵を与えるにはどうすればよいかということです。HMAC の署名に使用される秘密鍵は、これまでネットワーク経由で送信されることは想定されていないことを読み続けていますが、そもそもどうやってそれを取得するのでしょうか?
私の考えはこのようなものでしたが、これが有効かどうかはわかりません。
ユーザーのデータベース テーブル:
users (simplified, this would probably be a private key per client app?)
id (their public key?)
username
password?
privatekey
HTML/JS クライアントを想定すると、ユーザーには、次のような API に POST する従来のログイン ページが表示されます。
https://example.com/myapp/api/v1/authenticate.json
POST: username / password
それはどちらかを返します
404:User not found
200:{ "id" : <id>, "privatekey": <privatekey> }
次に、クライアントはそのキーをどこかに保存し (ローカル ストレージ/Cookie は安全な場所でしょうか?)、それを使用して、次のようなリクエストに署名します。
GET https://example.com/myapp/api/v1/something/?key1=value1&publickey={theirID}&hmac={hmac signature of the request using their private key}
次に、サーバーは公開鍵をチェックし、関連する秘密鍵を取得し、HMAC 署名を再構築します。それらが一致する場合は、認証された要求で処理します。
私はこれを正しく理解していますか?私の例のようにパスワードがまだ必要な場合、秘密鍵の役割を理解しているかどうかわからないので、何かが間違っている可能性があると言っています。