2016-04-12 48 views
0

我知道的存储和验证用户登录信息的方法有两种:验证和存储的node.js用户登录信息的最有效的方法

  1. 在服务器端的会话存储的用户ID,然后当有人打电话给服务器检查他们是否有用户会话。 (使用节点客户端会话)

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

尽管这两种方式都是可行的,适用的,我跟他们两个的问题/问题:

  1. 有人告诉我,在会话中存储的信息违背了REST API的想法自动扩展性。这是真的吗?有没有办法解决这个问题?

  2. 当存储认证密钥,你不会只能够一个键/实例存储每个用户。如果你想要在两台计算机或客户端上登录相同的帐户(我知道我可以创建一个认证表,但是如果客户端丢失了一个令牌并且认证令牌永远留在认证表中),你会怎么做。

如果有更好的方法可以做到这一点,请把它提出来,但我很困惑我们朝哪个方向前进。我倾向于第二种方式,但我仍然喜欢第一种方式。

编辑:我已经缩小到智威汤逊和我的第二个想法。我不知道哪个节点会更好。

回答

0

JSON Web Tokens怎么样?它们是您提到的第二种方法的变体,并且是公认的行业标准,因此您可以轻松找到堆栈的实现。

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

0

假设您使用快递,您可以使用express-session来管理您的会话。然后,您需要添加合适的session store而不是缺省的MemoryStore,它仅用于调试,并且不会扩展到多个流程实例(出于您在问题中提到的原因)。

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

相关问题