Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在node.js中验证和存储用户登录信息的最有效方法_Javascript_Node.js - Fatal编程技术网

Javascript 在node.js中验证和存储用户登录信息的最有效方法

Javascript 在node.js中验证和存储用户登录信息的最有效方法,javascript,node.js,Javascript,Node.js,我知道存储和验证用户登录信息的两种方法: 将用户id存储在服务器端会话中,然后在有人呼叫服务器时检查他们是否有用户会话。(使用节点客户端会话) 当用户登录时,将身份验证令牌存储在用户表中,并将令牌本地存储在用户客户端上。然后,当用户调用服务器时,他们将身份验证令牌作为头发送,并检查令牌是否在用户表中 虽然这两种方法都是可行和适用的,但我对这两种方法都有问题: 有人告诉我,在会话中存储信息违背了RESTAPI的自动可伸缩性思想。这是真的吗?有办法解决吗 在存储身份验证密钥时,每个用户是否只能存储一

我知道存储和验证用户登录信息的两种方法:

  • 将用户id存储在服务器端会话中,然后在有人呼叫服务器时检查他们是否有用户会话。(使用节点客户端会话)

  • 当用户登录时,将身份验证令牌存储在用户表中,并将令牌本地存储在用户客户端上。然后,当用户调用服务器时,他们将身份验证令牌作为头发送,并检查令牌是否在用户表中

  • 虽然这两种方法都是可行和适用的,但我对这两种方法都有问题:

  • 有人告诉我,在会话中存储信息违背了RESTAPI的自动可伸缩性思想。这是真的吗?有办法解决吗

  • 在存储身份验证密钥时,每个用户是否只能存储一个密钥/实例。如果您希望在两台计算机或客户端上登录同一个帐户,您会怎么做(我知道我可以创建一个身份验证表,但是如果客户端丢失了一个令牌,并且身份验证令牌永远保留在身份验证表中怎么办)

  • 如果有更好的方法,请提出来,但我很困惑该朝哪个方向走。我倾向于第二种方式,但我仍然喜欢第一种方式

    编辑:我已经把范围缩小到JWT和我的第二个想法。我不知道使用node哪个更好。

    怎么样?它们是您提到的第二种方法的变体,是公认的行业标准,因此您可以很容易地找到堆栈的实现


    您可以将令牌存储在像Redis这样的键值存储中,而不是关系数据库中,这样会更快。Redis还支持将密钥超时一段时间,因此过期的令牌将自动消失。您还可以对其进行设置,使每个令牌在使用后失效,并且对API的任何请求都会返回一个新令牌以在下一个请求中使用,从而允许用户不断刷新其令牌。

    假设您使用的是express,您可以使用它来管理会话

    然后,您需要添加一个合适的内存存储,而不是默认的MemoryStore,它仅用于调试,并且不会扩展到多个流程实例(出于您在问题中提到的原因)

    FRO示例,如果使用PostgreSQL数据库,可以考虑使用。这将把会话存储在数据库中,这样会话管理就不会阻止您扩展node.js服务器。此外,您可以为每个用户存储多个会话,这些会话将根据您配置的最大值过期(并自动擦除),从而解决您提到的第二个问题