V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
libaibuaidufu
V2EX  ›  Python

请问 jwt 并发 请求 token 时, token 覆盖,有什么好的处理方法吗?

  •  1
     
  •   libaibuaidufu · 2019-05-17 10:50:29 +08:00 · 5419 次点击
    这是一个创建于 2017 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如:在一个页面同时异步请求两个接口,这时 accesstoken 过期了,然后第一个请求去请求 refreshtoken ,后端覆盖了 accesstoken,第二个请求就出现 token 无效,要求重新登录。。。。

    17 条回复    2019-05-28 13:43:58 +08:00
    z960112559
        1
    z960112559  
       2019-05-17 11:13:48 +08:00
    当后端返回 accesstoken 过期时,中断所有请求,调用一个不能并发执行的方法刷新令牌,令牌刷新完后弄个回调函数重新去请求接口
    libaibuaidufu
        2
    libaibuaidufu  
    OP
       2019-05-17 11:17:49 +08:00
    查了一下资料,方案: 给 accesstoken 一个过期时间,然后每次请求验证 是否过期,当要过期时(离过期还有十分钟之内的)就去请求新的 token,然后后端 把旧的 token 缓存着,例如缓存十分钟,十分钟之内,使用旧的 token 依然可以请求。
    DavidNineRoc
        3
    DavidNineRoc  
       2019-05-17 11:23:51 +08:00
    可以参考 jwt-auth 的做法, 可以配置一个并发失效时间, 比如 2s,
    意思是即使这个 token 过期了, 那么这个 token 也能在 2s 内使用.
    micean
        4
    micean  
       2019-05-17 11:30:38 +08:00
    如果是 oauth2,一般框架会在返回令牌的时候给个过期时间,可以根据这个做提前处理

    话说回来,刷新令牌多刷几个又能怎么样……为什么要对访问令牌做废弃检查
    libaibuaidufu
        5
    libaibuaidufu  
    OP
       2019-05-17 11:49:20 +08:00
    @micean 因为存在数据库了 每次验证 都进行对比了 多刷的令牌 导致后面旧的令牌无法听过验证。。。。
    libaibuaidufu
        6
    libaibuaidufu  
    OP
       2019-05-17 11:50:09 +08:00
    @DavidNineRoc 我去看看 我用的 flask-jwt-extended 看看有没有这个配置。。。
    AngryPanda
        7
    AngryPanda  
       2019-05-17 11:53:02 +08:00
    请求 token 的操作由统一的 proxy 来负责,如果已经有请求发出去,则不再重复发送。
    mooncakejs
        8
    mooncakejs  
       2019-05-17 11:55:10 +08:00
    jwt 还要验证失效,那还不如随机 token。
    DavidNineRoc
        9
    DavidNineRoc  
       2019-05-17 11:55:17 +08:00
    @libaibuaidufu 如果没有这个配置, 可以自己设置, 也比较简单逻辑.
    建立一个中间件. 然后解析出 token 的有效信息. 得到 exp. 根据当前时间和 exp 对比, 如果过期在 2s 之内, 都允许通过.
    KKKKKK
        10
    KKKKKK  
       2019-05-17 12:16:00 +08:00 via iPhone
    JWT 是不储存过期时间在服务端的,过期时间储存在 token 里面,不能修改,所以要提前实战只能设置 black list
    micean
        11
    micean  
       2019-05-17 12:43:47 +08:00
    @libaibuaidufu
    我的意思是多发几个令牌对于你们业务有没有什么影响
    jwt 的令牌应该是签出去就有效,如果有废弃的需求,应该从令牌容纳的数据去设计,而不是废弃令牌本身
    saberlove
        12
    saberlove  
       2019-05-17 13:08:25 +08:00
    宽限时间了解一下
    whileFalse
        13
    whileFalse  
       2019-05-17 15:24:55 +08:00
    jwt 的意义就是不存后端也不直接废弃。如果你们存后端还要主动废弃,也不知道是想利用 jwt 的哪种特性。
    libaibuaidufu
        14
    libaibuaidufu  
    OP
       2019-05-17 16:37:28 +08:00
    @whileFalse 他们以前就这样用的 差不多 就是单一登录了。。。。。。
    libaibuaidufu
        15
    libaibuaidufu  
    OP
       2019-05-17 16:38:55 +08:00
    @saberlove 了解了一下 非常好,但是我用哪个插件似乎没有这个功能 要手动实现 。。。
    libaibuaidufu
        16
    libaibuaidufu  
    OP
       2019-05-17 16:52:46 +08:00
    @saberlove 找到配置了 。。。
    saberlove
        17
    saberlove  
       2019-05-28 13:43:58 +08:00
    emmm
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   928 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:27 · PVG 06:27 · LAX 14:27 · JFK 17:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.