2016-08-27 2 views
1

私はnodejsに、ajaxリクエストでしか通信しないAPIのセキュリティトークンを実装しました。
各トークンにセキュリティトークンが送信されます。このトークンが存在する場合、新しいトークンが生成され、ヘッダー経由で応答に送信されます。
存在しない場合、応答は403で終了します。これは、ログイン資格情報が渡されていない場合です。私は、同時に2つの要求を起動したときにnodejsのセキュリティトークントークン

問題があり、それらの両方が同じセキュリティトークンを送信する、(のはとBを言わせて)、は、このようにトークンを更新し、B前に終了しますの前にの前にBに渡されたトークンは、Aによって無効にされたため無効です。

どうすればこの問題を解決できますか?
どうすれば再実装できますか?

答えて

0

トークンは、クライアントとサーバーの間で共有されるトークンと、いくつかの外部パラメータに基づくトークンの2つの部分で構成されています。
を更新する場合は、を更新する必要はありません。

例として、クライアントとサーバーがtという名前の数値トークンを共有し、最初の呼び出し(ログイン、ユーザー作成、任意のもの)でトークンに同意するとします。
トークンを作成するときには、カウンタc0に設定して、の現在のトークン(またはそれ以上のもの)であるp = <t, c>を作成します。
トークンまたはカウンタは、どのような要求でも明示的に送信してはなりません。

クライアントがサーバーにメッセージを送信したい場合は、手順は次のとおりです。

  • v
  • 生成されたトークンを使用して要求を送信します v = t*c
  • <t,c+1>
  • としてpを更新し、新しい値を作成します。

各リクエストには固有の実際のトークンがあります。

がサーバにトークンを検証するために、手順は、次のとおり

  • 計算受け入れトークンaNのセットが、それは次のように
    • a0 = v*(c-N/2)c' = (c-N/2)
    • a1 = v*(c-N/2+1)
    • ...
    • aN = v*(c+N/2-1)
  • 受信したトークンに等しいaMが存在する場合、要求が受け入れられた場合、要求
  • を受け入れるc'が選択を作成するために使用される場合に応じてカウンタサーバ側の更新aMは現在c

この方法よりも大きい、同時要求がうまく処理され、明示的にトークンを更新する必要はありません。

要求が失敗すると、クライアントは何らかの形で専用エンドポイントで共有トークンtとカウンタcをリセットすることを決定できます。
サーバは、計算されたセット内に有効なaMが存在しないリクエストを単に拒否することができます。

もちろん、これらのトークンを何らかの形でどこかに保存できる必要があります。

+0

答えてくれてありがとう、私はそれを試してみよう! – patentul

+0

@patentulようこそ。それがあなたのニーズに合っているかどうか教えてください。また、必ずしも解決策としてnodejにバインドされているわけではありません。 – skypjack