nodejs 中实时令牌的安全时间

Security time to live token in nodejs

我在 nodejs 中为 API 实现了一个安全令牌,它仅通过 ajax 请求进行通信。
每次请求都会发送一个安全令牌,如果此令牌存在,则会生成一个新令牌并通过 header.
在响应中发送 如果不存在,则响应以 403 结尾,这是在没有通过登录凭据的情况下。

问题是当我同时启动两个请求时(比方说 A​​B),它们都发送了相同的安全令牌,A​​B 之前结束,因此在 B 之前更新令牌,因此令牌传递给 B 在这种情况下是无效的,因为它已被 A​​.

无效

我该如何解决这个问题?
我怎样才能重新实现它?

您可以使用由两部分组成的令牌:一部分在客户端和服务器之间共享,另一部分基于某些外部参数。
您甚至不必更新它。

举个例子,假设客户端和服务器共享一个名为 t 的数字令牌,并且他们在第一次调用(登录、用户创建,任何你想要的)期间就该令牌达成一致。
当他们创建令牌时,他们还将计数器 c 设置为 0 并创建一对 p = <t, c>current 令牌(或更好,最后一次看到)。
他们绝不能在任何请求中明确发送令牌或计数器。

当客户端要向服务器发送消息时,步骤为:

  • 创建新值v = t*c
  • 已将 p 更新为 <t,c+1>
  • 使用生成的令牌发送请求v

每个请求都会有一个唯一的实际令牌。

要验证服务器上的令牌,步骤是:

  • 计算一组已接受的令牌 aN,如下所示:
    • a0 = v*(c-N/2)(其中 c' = (c-N/2)
    • a1 = v*(c-N/2+1)
    • ...
    • aN = v*(c+N/2-1)
  • 如果存在aM等于收到的token,则接受请求
  • 如果请求已被接受,如果用于创建所选 aMc' 大于当前的 c
  • ,则相应地更新计数器服务器端

这样,可以很好地处理并发请求,并且您不必显式更新令牌。

每当请求失败时,客户端可以决定以某种方式使用专用端点重置共享令牌 t 和计数器 c
服务器可以简单地拒绝在计算集中不存在有效 aM 的请求,仅此而已。

当然,您必须能够以某种方式在某处存储这些令牌。