【发布时间】:2023-02-22 08:37:51
【问题描述】:
当用户通过电子邮件和密码或 OAuth(Google、Apple、Facebook...)在我的网站上进行身份验证时,我会使用用户的会话 ID 创建一个 cookie,并将会话数据存储在 Redis 中。
会话数据如下(它被序列化为字符串):
{
"id": "random_session_id",
"iat": 1677004020931,
"userId": "id_of_the_user_who_owns_the_session",
"device": "Samsung s10",
"ip": 0.0.0.0,
}
并且用id作为Redis key和过期时间存储,这显然与cookie的maxAgeInSeconds属性相同。
我的问题是当他重置密码时,我需要使用户的所有会话无效. 为此,我考虑在 Redis 中存储带有哈希的会话,如下所示:
- user_id
|--> session_id_1
|--> session_data_serialised
|--> session_id_2
|--> another_session_data_serialised
- user_id_2
|--> session_id_3
|--> session_data_serialised
|--> session_id_4
|--> session_data_serialised
这种方法的问题是您不能在 Redis 中设置哈希的过期时间,所以这不是我的选择。
然后我虽然创建了另一个缓存,我把每个用户的所有会话都放在其中,但是当会话过期时我还需要从这个缓存中删除条目,这似乎是不可能的。
我应该如何在这里实现我的目标?
【问题讨论】:
标签: session redis session-state