是否可以基于令牌识别用户?

时间:2017-01-18 11:14:07

标签: node.js mongodb

这是一个菜鸟问题。我正在使用nodejs处理rest api服务。我读过关于令牌的内容。我不明白网站如何识别用户。考虑一下。我最终有用户特定的数据。现在用户登录并使用我的数据库验证他/她的凭据。然后我返回一个令牌给它。现在在后续请求中只有令牌到达,所以如何知道必须访问哪个用户的数据?

2 个答案:

答案 0 :(得分:0)

您可以使用JSON Web Token存储一些用户基本数据(例如其ID或角色)。

然后,这是进程:

  • 用户登录并检索JWT
  • 令牌存储在用户的localStorage或cookies
  • 在每个下一个请求中,您需要在HTTP标头Authorization
  • 中发送令牌
  • 对于每个请求,您需要在后端检查此令牌
  • 要注销,您只需要删除localStorage或cookie中的令牌

答案 1 :(得分:0)

没有什么神奇之处,你必须在某处存储令牌,在现代架构中我们通常使用数据库,因为我们要远离会话,因为我们必须考虑水平扩展,其中会话管理在服务器之间出现问题。

所以这就是你能做的事情

  1. 在用户登录后返回用户令牌,并将该令牌保存在用户集合中(?)
  2. 后续调用将在标题
  3. 中包含该标记
  4. 使用该令牌查询用户集合,并查看它是否是有效用户或有效令牌。通过每次通话,您还可以保持时间戳,确保两次通话之间的持续时间不应超过设定的持续时间。因此模拟服务器会话。虽然这是可选的。
  5. 但是如果您使用的是mongoDB,可能还有其他方法。

    1. 维护一个单独的会话集合, 保存文档中的令牌和其他详细信息(用户代理,IP等)。
    2. 在令牌字段上添加唯一索引。
    3. 维护一个时间戳字段,让我们将其称为 sessionTimeOut ,并在该字段上添加TTL index一段时间(例如1小时)。
    4. 现在,下次在标头中获取令牌时,令牌会尝试更新(而不是upsert)sessionTimeOut字段额外的设置持续时间(1小时)。
    5. 检查写入结果中更新的记录数,如果为0记录,则表示会话已过期,因此请再次向客户端发送相应的消息。
    6. 如果它更新了一条记录,那么会话将延长1小时
    7. 这种模式的好处很少

      1. 您可以随时查看所有人都已登录。
      2. 如果您将其设为上限集合,则可以定义在应用程序中一次登录的用户数量。 (虽然没必要)
      3. 如果您将基本用户详细信息放在与令牌相关的集合中,则每次调用都不会对用户表进行不必要的访问。
      4. TTL索引删除过期的用户,因此集合永远不会太大。