web-dev-qa-db-ja.com

APIキーvs HTTP認証vs OAuth RESTful APIで

私が管理しているアプリケーションの1つのためにRESTful APIの構築に取り組んでいます。現在、より制御されたアクセスとセキュリティを必要とするさまざまなものを組み込むことを検討しています。 APIを保護する方法を調査しているときに、どのフォームを使用するかについていくつかの異なる意見を見つけました。 HTTP-Authが道であると言うリソースもありますが、APIキーを好む人もいれば、SOでここで見つけた質問も含めてOAuthを誓う人もいます。

そして、もちろん、たとえばAPIキーを好む人は、OAuthは、ユーザーに代わってアクセスを取得するアプリケーション用に設計されています(私が理解しているように、 -Facebookアカウントを使用するFacebookサイト)、および特別にサインアップしたサイト(Twitterサーバーにアクセスする公式Twitterクライアントなど)のリソースに直接アクセスするユーザー用ではありません。ただし、OAuthは、最も基本的な認証ニーズにも対応しているようです。

それから私の質問は、すべてがHTTPS経由で行われると仮定した場合、3つの実際的な違いは何ですか?いつ他の人よりも考慮されるべきですか?

97
Shauna

それはあなたのニーズに依存します。必要ですか:

  • ID – APIリクエストを行っていると主張しているのは誰ですか?
  • 認証-彼らは本当に彼らが彼らが言っている人ですか?
  • 承認-彼らは、やろうとしていることを行うことができますか?

または3つすべて?

API呼び出しの量または数を追跡するために呼び出し元を識別する必要がある場合は、単純なAPIキーを使用します。 APIキーを発行したユーザーがそれを他のユーザーと共有している場合、ユーザーはAPIを呼び出すこともできることに注意してください。

ただし、承認も必要な場合は、APIの呼び出し元に基づいて特定のリソースへのアクセスのみを提供する必要があります。その後、oAuthを使用します。

ここに良い説明があります: http://www.srimax.com/index.php/do-you-need-api-keys-api-identity-vs-authorization/

65
Sid

APIキーまたはトークンでさえも、REST APIの公開リソースへのアクセスを許可するため、直接認証および承認メカニズムのカテゴリに分類されます。このような直接メカニズムは、委任ユースケースで使用できます。

RESTエンドポイントによって公開されるリソースまたはリソースのセットにアクセスするには、IDに応じてリクエスター特権を確認する必要があります。ワークフローの最初のステップは、IDの検証です。リクエストをauthenticatingすることにより、一連の定義されたルールに対してIDをチェックしてauthorizingアクセスレベル(読み取り)上記の手順が完了すると、典型的なさらなる懸念は、リクエストの許可されたレート、つまり、リクエスターが1秒間に実行できるリクエストの数です指定されたリソースに向かって。

OAuth(Open Authorization) は、委任アクセスの標準プロトコルであり、多くの場合、パスワードを提供せずにアクセスを許可するために主要なインターネット企業によって使用されます。明らかなように、OAuthは、上記の懸念を満たすプロトコルです。リソース所有者に代わってサーバーリソースへの安全な委任アクセスを提供することによる認証と承認。これは、リソース所有者に代わってサーバーが管理するリソースへのアクセスを取得するサードパーティたとえば、ServiceXは、Johnが委任を承認した後、Johnに代わってJohn SmithのGoogleアカウントにアクセスしたい場合、ServiceXに時間が発行されますベースのトークンでGoogleアカウントの詳細にアクセスします。ほとんどの場合、読み取りアクセスのみです。

APIキーの概念は、上記のOAuthトークンに非常に似ています。主な違いは、委任がないことです。ユーザーは、プログラムインタラクションのためにサービスプロバイダーに直接キーを要求します。 APIキーの同様に時間ベースです:OAuthトークンとしてのキーは、タイムリースまたは有効期限の対象となります。追加の側面として、キーおよびトークンは、サービス契約によるレート制限。つまり、1秒あたりのリクエスト数は指定された数のみに対応できます。

要約すると、実際には、従来の認証および承認メカニズムとキー/トークンベースのバージョンの間に実際の違いはありません。ただし、パラダイムはわずかに異なります:クライアントとサーバー間のすべてのやり取りで資格情報を再利用し続ける代わりに、サポートキー/トークンを使用して、全体的なやり取りをよりスムーズで安全なものにします(多くの場合、 [〜#〜] jwt [〜#〜] 標準に従い、キーとトークンは、作成を回避するためにサーバーによってデジタル署名されます)。

  • 直接認証および認可:従来の資格証明ベースのバージョンの変形としてのキーベースのプロトコル。
  • 委任された認証と承認:トークンを使用するOAuthベースのプロトコルのように、再び資格ベースのバージョンのバリアントとして(全体の目標は開示されていませんサードパーティへのパスワード)。

どちらのカテゴリも、関心のあるリソースを所有するサーバーとの最初のやり取りに従来のID検証ワークフローを使用します。

1
Paolo Maresca