okwork
V2EX  ›  问与答

有什么 token 生成方式,可以按访问次数计算失效的吗?(一般 token 都是按时间计算失效)

  •  
  •   okwork · Aug 29, 2019 via Android · 3941 views
    This topic created in 2499 days ago, the information mentioned may be changed or developed.
    通常 token 一般都是超时失效。如果想要 token 按使用次数失效(且后端不需要设计计数器),比如 token 用过一次就失效。
    20 replies    2019-08-30 09:40:53 +08:00
    HENQIGUAI
        1
    HENQIGUAI  
       Aug 29, 2019
    redis incr
    inhzus
        2
    inhzus  
       Aug 29, 2019 via Android
    超时失效的逻辑是,token 中有设置的超时时间的时间戳,在服务端和当前时间比较下就可以判断是否过期。
    按次数失效的话,我直观上觉得仅凭 token 中的某个标志位是不可取的。看楼下大佬有没有好的想法,或者有其他不使用 token 达到次数失效的有意思的方法
    shalk
        3
    shalk  
       Aug 29, 2019 via iPhone
    比较时间戳和比较次数是一回事。你已经假定 token 不变,token 里只能带次数上限,后端肯定要知道已使用次数,要么放在外部,要么放在内部。
    momocraft
        4
    momocraft  
       Aug 29, 2019
    想不出这样的 token 怎样抗重放攻击
    netnr
        5
    netnr  
       Aug 29, 2019
    这就是卡密需求,有时间、次数限制,比如说卡密有效期三个月,那么后台得记录三个月内的卡密兑换情况,超出月份的可以删除(前提是卡密是包含了年月信息)

    楼下正解?
    zhujinliang
        6
    zhujinliang  
       Aug 29, 2019 via iPhone   ❤️ 2
    除非服务器端有记录 token 使用次数,否则的话估计只能利用超自然现象了,比如:
    token 中放一句诗或一张图片,会导致看到这个信息的人的时间减少一秒,服务器端可以通过比对正常时间流逝与请求方时间流逝的差别判断 token 被使用了多少次
    diegozhu
        7
    diegozhu  
       Aug 29, 2019
    1. 要么 token 里面加个 maxCount, 服务器端计数。
    2. 要么 token 里面加个 visitCount,每次都 refresh token,当 visitCount >= server 端配置的 maxCount,就不允许 refresh token.

    token 是不变的,类似 readonly。只有 token 过期重新获取才会改变。大部分这种计数的需求都是放在 server 端做。
    server 端不计数可以通过第二种方式,但是第二种方式,就违背了 token 作为令牌的设计理念了。本来只要持有令牌,则可在一定时间内访问,变成每次都要 refresh 了。 所有请求都要 refresh,会对系统压力好大。本来只需要验证下 token 是否有效,现在每个请求都要重新生成一个 token....很容易成为瓶颈。
    chinvo
        8
    chinvo  
       Aug 29, 2019 via iPhone
    @diegozhu #7 第二个方案有个疑点,如果客户端不请求刷新 token,那么 visit count 不会变化,并且此 token 仍然有效
    skiy
        9
    skiy  
       Aug 29, 2019
    用 redis,反正 token 我都是用 redis 来存的。
    ipwx
        10
    ipwx  
       Aug 29, 2019 via Android
    不论是计数还是计时,服务器不存是不可能的
    chinvo
        11
    chinvo  
       Aug 29, 2019 via iPhone
    @ipwx #10 计时确实可以不存,只需要判断时间戳就好

    不过我一般会存 token id,额外验证吊销状态
    a719114136
        12
    a719114136  
       Aug 29, 2019 via Android
    你后端不想存,只能把数据加密发给前端,前端再返回给你。
    当然这样是放弃了安全
    orcusfox
        13
    orcusfox  
       Aug 29, 2019
    TOTP 和 HOTP ?不过有一定限制
    wysnylc
        14
    wysnylc  
       Aug 29, 2019
    访问一次 redis+1,达到限定次数后返回限制异常信息
    解析问题,别把简单问题复杂化
    nmdx
        15
    nmdx  
       Aug 29, 2019 via Android
    虽然我是一个外行,但你这说的不就是卡密嘛。。。
    zhang77555
        16
    zhang77555  
       Aug 29, 2019
    后端判断这个 token 是否有效和还能用几次 基本没啥差别
    whp1473
        17
    whp1473  
       Aug 29, 2019
    服务端不存就是 jwt 那种,每次生成一个新的 token,但是重放攻击你怎么防止,被使用过的仍然符合你的验证规则。所以按次这种,服务端必然要存。
    Yanni0507
        18
    Yanni0507  
       Aug 29, 2019
    @zhujinliang 过于暴力,加急处理吧
    robinlovemaggie
        19
    robinlovemaggie  
       Aug 30, 2019
    你这明显是想将 session 的事情交给 token 做,有点强人所难。
    diegozhu
        20
    diegozhu  
       Aug 30, 2019
    @chinvo 对哦。如此说来,服务器端还是要记录一个 是否访问过 只不过由 number 变成 boolean 了。。所以,服务器端不记是不可能的。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5953 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 02:57 · PVG 10:57 · LAX 19:57 · JFK 22:57
    ♥ Do have faith in what you're doing.