2013-10-16 37 views
10

私はRESTful APIを設計し始めました。認証を処理する方法について考えています。私は何らかの認証トークンを使用したいが、同様のインフラストラクチャをOAuthで使用することはできないので、私はそれを自分で処理しなければならない。RESTful APIに認証トークンを格納する場所

このAPIの要件の1つは、拡張する必要が生じる前に大量の要求を処理するのに十分なパフォーマンスが必要であることです。私の懸案事項は、トークン(完全性、有効期限、IPアドレスなど)を検証するために必要な時間を、可能な限り少なくする方法です。

トークンは、復号化時間が重くなるため、ユーザー情報を含む暗号化された文字列ではなく、ある種のハッシュである必要があります。

私は、キーがトークンであり、その値が要求を処理するのに必要なユーザー情報であるメモリ内のハッシュテーブルにトークンを格納できると読んだが、クラスタ化された環境でこの作業を行うにはどうすればよい各ノードにハッシュテーブルが存在する場所はどこですか?

DBテーブルにトークンを置く必要があります毎回DBにヒットしますか?期限切れのチケットの保持を手動で処理しますか?

質問にはそれほど重要ではないかもしれませんが、私はSpring MVCをRESTfull APIに使用しています。

ありがとうございます。

+0

[REST API認証トークン]の複製が可能です(http://stackoverflow.com/questions/7919533/rest-api-authentication-tokens) – mayabelle

+0

@mayabelleフィードバックありがとうございます。私はポストが私のニーズをカバーしているとは思わない。私の質問は:私はハッシュテーブルまたは類似(私はおそらくGoogle Guavaのタイムドキャッシュに行く)を使用している場合どのようにNLB環境でキャッシュを共有するのですか?トークンをチェックする必要があるたびにDBを使用してDBに検索するか、より良い方法がありますか? – Nicola

答えて

3

httpsを使用すると仮定しているため、すべてのトラフィックは暗号化されています。私は次の原則の1つを提案します。

基本認証

あなたはリクエストのAuthorizationヘッダーに認証情報を追加することができます。この資格情報はBase64でエンコードされます(下記参照)。この資格情報はリクエストごとに送信され、DBで確認することができます。この高速化とIO集中化を実現するには、キャッシュを使用することができます。かつてキャッシュなしでこのようなAPIを実装し、毎秒何千ものリクエストを処理することができました。

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

許可トークン

トークンを使用して、あなたのアイデアを実装するためのさまざまな方法があります。一般的なのは、すべてのAPIユーザーは、通常は期限切れにならないapiキーと呼ばれる独自のトークンを持っているということです。もう1つは、最初に(基本認証)を承認してから有効期限が切れるトークンを取得する必要があることです。これは特定の時間apiキーとして使用されます。

いずれにしても、キャッシュを使用するかどうかを決める必要があります。私はそれを単純にして、基本認証に行き、毎回dbをチェックします。ほぼすべてのフレームワークは、単純なhttpであるため、このアプローチを非常によくサポートしています。これによりパフォーマンスの問題が発生した場合(とにかくパフォーマンステストをお勧めします)、JPAキャッシュに資格情報を含むテーブルを追加してみてください。期限切れのトークンで何かを実装したいのであれば、Infinispanを見てください。

5

私はメモリ内キャッシュとdbキャッシュの両方を使用して問題を解決しました。ここでは、同じタスクを持つ人を助けるかもしれない私の解決策の要約です。

  • ユーザーがログインした時点で、一意のキーが生成され、ユーザーに返されます。
  • ログイントークン(基本的には処理のあるGUID)は、exipirationのような追加情報とユーザーの情報と役割を持つdbテーブルにも格納されます。同じ情報がメモリに保存されます(トークンがキーであるGoogleグーグルハッシュテーブル)
  • トークンは、認証トークンで@ipaが提案するようにすべてのapi呼び出しとともに渡される必要があります
  • サーバコードはトークンがそのメモリキャッシュにある場合は、ユーザー情報はすでに使用可能です(クラスタ内の別のノードでapi呼び出しが行われたなど)トークンがトークンで検索されているdb
  • トークンが見つかると、など...

これにより、パフォーマンスとセキュリティが向上し、任意のアルゴリズムでトークンを生成できますすべてのAPI呼び出しで再計算する必要がないので、比較的遅いものでもあります。また、これは水平に拡大することができるステートレスサービスで動作します。

+1

トークンをクライアント側にどのように格納していますか?メモリ内に、クッキー、ローカルストレージ?また、どうすればXSSとCSRFを守ることができますか? – YarGnawh

+0

@ YarGnawhサーバーサイドWebサービスRESTApiを作成したばかりの時点では、まだWebアプリケーションはありません。とにかく私はwepアプリのためにいくつかのテストを行いました。基本的には、セッションの使用を避け、ユーザーのCookieストアに認証トークンを保存するために、春のセキュリティフィルタをオーバーライドすることでした。私はCSRFの保護をテストしませんでしたが、この方法でSpringセキュリティを使用すると、AngularJSのようなjsフロントエンドのフレームワークでもCSRF機能を少しでも活用できるはずです。 – Nicola

+0

redisのような共有メモリキャッシュにトークンを保存してみませんか?それは非常に簡単にまた有効期限を処理します。 – splinter123

0

Redisにトークンを格納できます。 DBに格納する場合は、サーバーを最適化して(管理している場合は)、読み取り操作を行うようにしてください。私は、人々がキーバリューストアを使用した実装のカップルを持っています。ハッシュテーブルも良い考えです。

関連する問題