V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LzxHahaha
V2EX  ›  API

用 redis 存储 token 时,如何在用户重新登录时清除之前的 token?

  •  
  •   LzxHahaha · 2016-08-28 00:29:45 +08:00 · 5546 次点击
    这是一个创建于 3000 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想用 { token: userId } 的形式将登录后产生的 token 保存在 redis 中,当用户使用 token 登录时就根据 token 来找出对应的 id ,但是这样在用户重新登录(比如换个设备,之前没退出)时,该如何清除之前保存的 token ?

    7 条回复    2016-08-28 02:21:51 +08:00
    ss098
        1
    ss098  
       2016-08-28 00:47:07 +08:00 via Android
    你可以使用 token_username 作为键。
    billlee
        2
    billlee  
       2016-08-28 00:52:38 +08:00
    所谓 NoSQL, 就是要你自己设计需要的数据结构,编程去实现复杂查询。这里可以模拟 secondary index.
    set session:${token} ${uersId}
    hset ${userId} session => token
    billlee
        3
    billlee  
       2016-08-28 00:53:51 +08:00   ❤️ 1
    上面是笔误
    hset session:${token} userId ${uersId}
    hset user:${userId} session ${token}
    caola
        4
    caola  
       2016-08-28 01:17:26 +08:00
    @billlee 你的这个方案相当于两个 KEY ,
    token 作为 key 记录 userid ,
    userid 作为 key 记录 token 。

    在下次登录时,就检查比较一下。
    skydiver
        5
    skydiver  
       2016-08-28 01:22:24 +08:00 via iPad
    TTL 过期自动删除
    kslr
        6
    kslr  
       2016-08-28 01:48:45 +08:00 via Android
    不太理解你的意思

    登录后得到 Token
    Token 可以用来登录账户

    其他地方使用账户登录,那不是自动就下线了吗?因为 token 变了啊
    lecher
        7
    lecher  
       2016-08-28 02:21:51 +08:00   ❤️ 1
    这个需求应该是要实现唯一设备登录的业务吧。当两个设备都操作登录时,后操作的设备将具备登录权限,而之前登录的设备失去登录权限。

    通常的登录业务,按照 token 随机生成的话,不同设备拥有不同的 token ,根据 token 来作为 key 保存登录数据,是可以同时登录同一个帐号,并且都保持在线的。因为这些 token 里面如果存登录状态的话,都会是已登录模式。

    既然有这个唯一设备登录的需求,那就单独设置一个 user_login 的规则好了,比如 @caola 提供的方案, token 记录会话数据, userid 记录最后登录的 token ,这样只要有新请求过来,拿它的 token 以及 userid 里面存的 token 比较,不一致,就说明此登录已失效。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2566 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 16:03 · PVG 00:03 · LAX 08:03 · JFK 11:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.