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,则接受请求
- 如果请求已被接受,如果用于创建所选
aM
的 c'
大于当前的 c
,则相应地更新计数器服务器端
这样,可以很好地处理并发请求,并且您不必显式更新令牌。
每当请求失败时,客户端可以决定以某种方式使用专用端点重置共享令牌 t
和计数器 c
。
服务器可以简单地拒绝在计算集中不存在有效 aM
的请求,仅此而已。
当然,您必须能够以某种方式在某处存储这些令牌。
我在 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,则接受请求 - 如果请求已被接受,如果用于创建所选
aM
的c'
大于当前的c
,则相应地更新计数器服务器端
这样,可以很好地处理并发请求,并且您不必显式更新令牌。
每当请求失败时,客户端可以决定以某种方式使用专用端点重置共享令牌 t
和计数器 c
。
服务器可以简单地拒绝在计算集中不存在有效 aM
的请求,仅此而已。
当然,您必须能够以某种方式在某处存储这些令牌。