トークンは、クライアントとサーバーの間で共有されるトークンと、いくつかの外部パラメータに基づくトークンの2つの部分で構成されています。
を更新する場合は、を更新する必要はありません。
例として、クライアントとサーバーがt
という名前の数値トークンを共有し、最初の呼び出し(ログイン、ユーザー作成、任意のもの)でトークンに同意するとします。
トークンを作成するときには、カウンタc
を0
に設定して、の現在のトークン(またはそれ以上のもの)である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
が存在しないリクエストを単に拒否することができます。
もちろん、これらのトークンを何らかの形でどこかに保存できる必要があります。
答えてくれてありがとう、私はそれを試してみよう! – patentul
@patentulようこそ。それがあなたのニーズに合っているかどうか教えてください。また、必ずしも解決策としてnodejにバインドされているわけではありません。 – skypjack