关于 refresh token 的问题? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
andrew2558
V2EX    编程

关于 refresh token 的问?

  •  1
     
  •   andrew2558 2023-01-31 10:42:27 +08:00 3222 次点击
    这是一个创建于 1050 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我知道 refresh token 主要用于无感知的获取新的 access token ,但没有看到关于 refresh token 刷新的介绍,都是说 refresh token 过期后,需要用户重新登录。比如说我的 refresh token 过期时间设置为 7 天,那么也就是说不管怎样使用,客户每 7 天都必需要登录一次。

    但实际中,我们发现很少有这种情况。只要你天天使用,基本不会让你重新登录 那这些网站或 app 是如何做的呢?它们是有一套 refresh token 刷新机制还是其它的方法?

    18 条回复    2023-01-31 14:34:22 +08:00
    rebang
        1
    rebang  
       2023-01-31 10:56:38 +08:00   1
    在使用 refresh token 刷新的同时,会返回一个新的 refresh token
    andrew2558
        2
    andrew2558  
    OP
       2023-01-31 11:01:01 +08:00
    @sunhuawei 你的意思是指 Access token 每次刷新的同时,也刷新 refresh token 并重新设置 refresh token 的过期时间吗?
    Tyaqing
        3
    Tyaqing  
       2023-01-31 11:03:22 +08:00   1
    第一个问题是网站大多数还是使用 cookie 来记录登录,jwt 也是一样,可以放在 cookie 里面,一般时长都会很大,并且访问会自动续期.
    第二个问题.refresh token 和 token 都是需要服务端存储的,鉴定和刷新是一套机制,并且有一个 jwt 规范你可以参考一下
    https://www.rfc-editor.org/rfc/rfc7519
    ttwxdly
        4
    ttwxdly  
       2023-01-31 11:04:14 +08:00   1
    每次 refresh 后会返回新的 refresh token ,refresh token 的生命周期要比 access token 长。 refresh token 也可以做成重复使用的,但是不推荐。
    0xC000009F
        5
    0xC000009F  
       2023-01-31 11:05:12 +08:00   1
    如果用的是 Spring Security 的话 AuthorizationServerEndpointsConfigurer.reuseRefreshTokens 可以配置刷新 access token 的时候可以同时刷新 refresh token
    andrew2558
        6
    andrew2558  
    OP
       2023-01-31 11:13:42 +08:00
    谢谢大家的回答,大家好像说的都是在刷新 access token 时同时更新 refresh token,这里就要一个问题了,如果 refresh token 存储在数据库,那么每次刷新 access token (时间相对较短)也同时刷新 refresh token,那么无疑对服务器是一个很大的开销。
    iX8NEGGn
        7
    iX8NEGGn  
       2023-01-31 12:09:04 +08:00 via iPhone   1
    @andrew2558 不是,token 是无状态的,干嘛要存服务端?
    LeegoYih
        8
    LeegoYih  
       2023-01-31 12:14:59 +08:00   1
    简单做法,每次获取 session 的时候给 access token 续期
    SethShi
        9
    SethShi  
       2023-01-31 12:53:37 +08:00   1
    1. access_token 过期七天才对, refresh_token 一般没这么短.
    2. 刷新 token 一般不会刷新 refresh_token, 刷新的是 access_token(需要用 refresh_token 刷新)
    3. 你完成可以把 refresh_token 设置为按年为单位的(只有当 access_token 过期才会在接口中传递 refresh_token, 所以比 access_token 安全, 完全可以设置有效期久一点).
    theqiang
        10
    theqiang  
       2023-01-31 14:00:14 +08:00   1
    OP 是不是对 token 有点误解,应该不用存 db 的吧
    centralpark
        11
    centralpark  
       2023-01-31 14:05:23 +08:00   1
    如果用 uuid 这种随机数做 token ,那肯定需要存到数据库,保留有效期和用户 ID 等数据。如果用 jwt 这类使用私钥签名的数据做 token ,那就不需要存出到数据库了,服务端不查库,拿私钥解析出来其中的数据即可。
    andrew2558
        12
    andrew2558  
    OP
       2023-01-31 14:05:35 +08:00
    @iX8NEGGn @theqiang 这个是 refresh token, 过期时间会比较长,所以要存起来,保证状态
    iX8NEGGn
        13
    iX8NEGGn  
       2023-01-31 14:16:59 +08:00
    @centralpark @andrew2558

    Token 这个术语不就是为了和 Session 区分开吗,如果服务端要维护状态那就叫 Session ,而不应该把它归类为 Token 的一种,这就 内存 和 外存 一样,发明这两个术语就是为了做区分,而有的人把 内存 叫做 运行内存,把 外存 叫做 储存内存,我很厌恶这种方式。
    andrew2558
        14
    andrew2558  
    OP
       2023-01-31 14:25:42 +08:00
    @andrew2558 是的,这里指的 refresh token 并不是严格意义上的 jwt, 可以是一个自定义算法生成的字符串
    andrew2558
        15
    andrew2558  
    OP
       2023-01-31 14:26:25 +08:00
    @iX8NEGGn 楼上 @错了
    iX8NEGGn
        16
    iX8NEGGn  
       2023-01-31 14:27:15 +08:00
    @centralpark @andrew2558 好吧,久不接触,理解错了,我好像 Token 把 JWT Token 搞混了
    giter
        17
    giter  
       2023-01-31 14:31:07 +08:00   1
    accessToken 存用户本地,refreshToken 可以存 Redis 中。accessToken 过期时间很短,refreshToken 过期时间很长。

    如果 accessToken 过期而 refreshToken 没有过期,则生成新的 accessToken 发给用户;
    如果 accessToken 与 refreshToken 双双过期,则让用户重新登录。
    giter
        18
    giter  
       2023-01-31 14:34:22 +08:00
    @giter #17

    在 accessToken 过期而 refreshToken 没有过期情况中,可以让 refreshToken 重置时长,也可以不重置。只要用户隔三差五地访问,就代表是个活跃用户,就尽量延长 refreshToken 的存活时间,以让 accessToken 无感知地发给用户,达到持久登录的效果
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5238 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 07:55 PVG 15:55 LAX 23:55 JFK 02:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86