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

关于 refresh token 的问题?

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

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

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

    18 条回复    2023-01-31 14:34:22 +08:00
    sunhuawei
        1
    sunhuawei  
       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 续期
    seth19960929
        9
    seth19960929  
       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   ·   实用小工具   ·   940 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:41 · PVG 06:41 · LAX 14:41 · JFK 17:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.