Node.js nodejs中的安全生存时间令牌

Node.js nodejs中的安全生存时间令牌,node.js,algorithm,security,ttl,Node.js,Algorithm,Security,Ttl,我在nodejs中实现了一个只通过ajax请求进行通信的API的安全令牌。 每个请求都会发送一个安全令牌,如果该令牌存在,则会生成一个新令牌,并通过标头在响应中发送。 如果不存在,则响应以403结尾,这是在没有传递登录凭据的情况下 问题是,当我同时启动两个请求(比如A和B)时,它们都发送相同的安全令牌,A在B之前结束,因此在B之前更新令牌,因此在本例中传递给B的令牌无效,因为它被A无效 如何克服这个问题? 如何重新实现它?您可以使用由两部分组成的令牌:一部分在客户端和服务器之间共享,另一部分基于

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

问题是,当我同时启动两个请求(比如A和B)时,它们都发送相同的安全令牌,A在B之前结束,因此在B之前更新令牌,因此在本例中传递给B的令牌无效,因为它被A无效

如何克服这个问题?

如何重新实现它?

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

例如,假设客户机和服务器共享一个名为
t
的数字令牌,并且在第一次调用(登录、用户创建,任何您想要的)期间,他们都同意该令牌。
当他们创建令牌时,他们还将计数器
c
设置为
0
,并创建一对
p=
,这是当前令牌(或者更好,是最后看到的令牌)。
他们决不能在任何请求中显式发送令牌或计数器

当客户端希望向服务器发送消息时,步骤如下:

  • 创建新值
    v=t*c
  • p
    更新为
  • 使用生成的令牌发送请求
    v
每个请求将具有唯一的实际令牌

要验证服务器上的令牌,请执行以下步骤:

  • 计算一组接受的令牌
    aN
    ,如下所示:
    • a0=v*(c-N/2)
      (其中
      c'=(c-N/2)
    • a1=v*(c-N/2+1)
    • aN=v*(c+N/2-1)
  • 如果存在与接收到的令牌相同的
    aM
    ,则接受请求
  • 如果请求已被接受,如果用于创建所选
    aM
    c'
    大于当前
    c
这样,并发请求得到了很好的处理,您不必显式地续订令牌

每当请求失败时,客户端可以决定使用专用端点以某种方式重置共享令牌
t
和计数器
c

服务器可以简单地拒绝在计算集中不存在有效的
aM
的请求,仅此而已


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

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

例如,假设客户机和服务器共享一个名为
t
的数字令牌,并且在第一次调用(登录、用户创建,任何您想要的)期间,他们都同意该令牌。
当他们创建令牌时,他们还将计数器
c
设置为
0
,并创建一对
p=
,这是当前令牌(或者更好,是最后看到的令牌)。
他们决不能在任何请求中显式发送令牌或计数器

当客户端希望向服务器发送消息时,步骤如下:

  • 创建新值
    v=t*c
  • p
    更新为
  • 使用生成的令牌发送请求
    v
每个请求将具有唯一的实际令牌

要验证服务器上的令牌,请执行以下步骤:

  • 计算一组接受的令牌
    aN
    ,如下所示:
    • a0=v*(c-N/2)
      (其中
      c'=(c-N/2)
    • a1=v*(c-N/2+1)
    • aN=v*(c+N/2-1)
  • 如果存在与接收到的令牌相同的
    aM
    ,则接受请求
  • 如果请求已被接受,如果用于创建所选
    aM
    c'
    大于当前
    c
这样,并发请求得到了很好的处理,您不必显式地续订令牌

每当请求失败时,客户端可以决定使用专用端点以某种方式重置共享令牌
t
和计数器
c

服务器可以简单地拒绝在计算集中不存在有效的
aM
的请求,仅此而已


当然,您必须能够以某种方式将这些代币存储在某个地方。

谢谢您的回答,我会试试@不客气。让我知道它是否适合你的需要。还要注意的是,这不一定是作为解决方案绑定到nodejs的。谢谢你的回答,我会试试的@不客气。让我知道它是否适合你的需要。还请注意,它不一定作为解决方案绑定到nodejs。