10

RESTful API の設計を開始し、認証の処理方法について考えています。ある種の認証トークンを使用したいのですが、OAuth や同様のインフラストラクチャを使用できないため、自分で処理する必要があります。

この API の要件の 1 つは、スケーリングが必要になる前に大量のリクエストを処理するのに十分なパフォーマンスを備えている必要があることです。私の懸念は、各リクエストでトークン (整合性、有効期限、IP アドレスなど) を検証するのに必要な時間をできるだけ短くする方法です。

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

キーがトークンで、値がリクエストを処理するために必要なユーザー情報であるメモリ内ハッシュテーブルにトークンを保存できることを読みましたが、クラスター化された環境でこれを機能させるにはどうすればよいですか各「ノード」のハッシュテーブル?

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

おそらく質問にはそれほど重要ではありませんが、RESTfull API には Spring MVC を使用しています。

前もって感謝します。

4

3 に答える 3

5

インメモリキャッシュとデータベースキャッシュの両方を使用して問題を解決しました。これは、同じタスクを持つ人に役立つ可能性のある私のソリューションの概要です。

  • ユーザーがログインすると、その瞬間に一意のキーが生成され、ユーザーに送り返されます。
  • そのログイン トークン (基本的には何らかの処理を伴う GUID) も、期限切れなどの追加情報やユーザーの情報とロールと共に db テーブルに格納されます。同じ情報がメモリにも保存されます(トークンがキーであるグーグルグアバハッシュテーブル)
  • @ipaが提案したように、認証トークンのすべてのAPI呼び出しとともにトークンを渡す必要があります
  • サーバー コードは、トークンがメモリ キャッシュにあるかどうかをチェックします。ユーザー情報は既に利用可能です。それ以外の場合 (たとえば、クラスター内の別のノードで API 呼び出しが行われる場合)、トークンはトークン データベースで検索されます。
  • トークンが見つかったら、有効期限、ロールなどを確認できます...

これにより、適切なレベルのパフォーマンスとセキュリティが得られます。トークンは、API 呼び出しごとに再計算する必要がないため、比較的遅いアルゴリズムでも任意のアルゴリズムで生成できます。また、これは水平方向にスケールアップできるステートレス サービスでも機能します。

于 2014-05-04T15:06:38.620 に答える
3

https を使用していると想定しているため、すべてのトラフィックが暗号化されています。次の原則のいずれかをお勧めします。

基本認証

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

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

認可トークン

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

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

于 2014-05-02T11:24:51.330 に答える