您可以使用JSON Web Token存储一些用户基本数据(例如其ID或角色)。
然后,这是进程:
- 用户登录并检索JWT
- 令牌存储在用户的localStorage或cookies
中
- 在每个下一个请求中,您需要在HTTP标头
Authorization
中发送令牌
- 对于每个请求,您需要在后端检查此令牌
- 要注销,您只需要删除localStorage或cookie中的令牌
没有什么神奇之处,你必须在某处存储令牌,在现代架构中我们通常使用数据库,因为我们要远离会话,因为我们必须考虑水平扩展,其中会话管理在服务器之间出现问题。
所以这就是你能做的事情
- 在用户登录后返回用户令牌,并将该令牌保存在用户集合中(?)
- 后续调用将在标题
中包含该标记
- 使用该令牌查询用户集合,并查看它是否是有效用户或有效令牌。通过每次通话,您还可以保持时间戳,确保两次通话之间的持续时间不应超过设定的持续时间。因此模拟服务器会话。虽然这是可选的。
醇>
但是如果您使用的是mongoDB,可能还有其他方法。
- 维护一个单独的会话集合,
保存文档中的令牌和其他详细信息(用户代理,IP等)。
- 在令牌字段上添加唯一索引。
- 维护一个时间戳字段,让我们将其称为 sessionTimeOut ,并在该字段上添加TTL index一段时间(例如1小时)。
- 现在,下次在标头中获取令牌时,令牌会尝试更新(而不是upsert)sessionTimeOut字段额外的设置持续时间(1小时)。
- 检查写入结果中更新的记录数,如果为0记录,则表示会话已过期,因此请再次向客户端发送相应的消息。
- 如果它更新了一条记录,那么会话将延长1小时
醇>
这种模式的好处很少
- 您可以随时查看所有人都已登录。
- 如果您将其设为上限集合,则可以定义在应用程序中一次登录的用户数量。 (虽然没必要)
- 如果您将基本用户详细信息放在与令牌相关的集合中,则每次调用都不会对用户表进行不必要的访问。
- TTL索引删除过期的用户,因此集合永远不会太大。
醇>