概要
アプリケーション用の (REST) API を作成しようとしています。初期/主な目的は、モバイル アプリ (iPhone、Android、Symbian など) での使用です。私は、Web ベースの API の認証と認可のさまざまなメカニズムを (他の実装を研究することによって) 調べてきました。基本的な概念のほとんどについて頭を悩ませていますが、まだいくつかの分野でガイダンスを探しています。私が最後にやりたいことは車輪の再発明ですが、私の基準に合った標準的な解決策が見つかりません (ただし、私の基準は見当違いである可能性があるので、それについても自由に批判してください)。さらに、API を使用するすべてのプラットフォーム/アプリケーションで同じ API を使用したいと考えています。
oAuth
oAuth が提供される最初のソリューションになる可能性が高いことはわかっているので、oAuth に異議を唱えます。モバイル アプリケーション (より具体的には非 Web アプリケーション) の場合、認証のためにアプリケーションを離れる (Web ブラウザーに移動する) のは間違っているようです。さらに、ブラウザーがコールバックをアプリケーション (特にクロスプラットフォーム) に返す方法はありません (私は認識しています)。私はそれを行うアプリをいくつか知っていますが、それは単に間違っていると感じ、アプリケーションの UX を中断させてしまいます。
要件
- ユーザーはユーザー名/パスワードをアプリケーションに入力します。
- すべての API 呼び出しは、呼び出し元のアプリケーションによって識別されます。
- オーバーヘッドは最小限に抑えられ、認証の側面は開発者にとって直感的です。
- このメカニズムは、エンド ユーザー (ログイン資格情報が公開されない) と開発者 (アプリケーション資格情報が公開されない) の両方にとって安全です。
- 可能であれば、https を要求しないでください (決して厳しい要件ではありません)。
実装に関する私の現在の考え
外部の開発者が API アカウントを要求します。apikey と apisecret を受け取ります。すべてのリクエストには、少なくとも 3 つのパラメータが必要です。
- apikey - 登録時に開発者に与えられる
- タイムスタンプ - 特定の apikey の各メッセージの一意の識別子としても機能します
- hash - タイムスタンプ + apisecret のハッシュ
apikey は、リクエストを発行するアプリケーションを識別するために必要です。タイムスタンプは oauth_nonce と同様に機能し、リプレイ攻撃を回避/軽減します。ハッシュは、リクエストが実際に特定の apikey の所有者から発行されたことを保証します。
認証済みのリクエスト (ユーザーに代わって行われるリクエスト) については、access_token ルートを使用するか、ユーザー名とパスワードのハッシュの組み合わせを使用するか、まだ決めかねています。いずれにせよ、ある時点でユーザー名とパスワードの組み合わせが必要になります。その場合、いくつかの情報 (apikey、apisecret、timestamp) + パスワードのハッシュが使用されます。 この点についてフィードバックをいただければ幸いです。 参考までに、パスワードをハッシュせずにシステムに保存しないため、最初にパスワードをハッシュする必要があります。
結論
参考までに、これは API を構築/構造化する方法の要求ではなく、アプリケーション内のみから認証と承認を処理する方法のみです。
ランダムな考え/ボーナス質問
リクエストの一部として apikey のみを必要とする API の場合、apikey の所有者以外の誰かが apikey を (平文で送信されているため) 見ることができず、使用制限を超えてそれらをプッシュする過度のリクエストを行うことをどのように防ぎますか? たぶん私はこれを考えすぎているだけかもしれませんが、リクエストが apikey 所有者に対して検証されたことを認証するものがあるべきではありませんか? 私の場合、それが apisecret の目的であり、ハッシュされずに表示/送信されることはありません。
ハッシュといえば、md5 と hmac-sha1 はどうですか? すべての値が十分に長いデータ (つまり、apisecret) でハッシュされている場合、それは本当に重要ですか?
以前、ユーザーのパスワード ハッシュにユーザー/行ごとのソルトを追加することを検討していました。私がそれを行うとしたら、使用されているソルトを知らずに、アプリケーションはどのようにして一致するハッシュを作成できるのでしょうか?