我知道 refresh token 主要用于无感知的获取新的 access token ,但没有看到关于 refresh token 刷新的介绍,都是说 refresh token 过期后,需要用户重新登录。比如说我的 refresh token 过期时间设置为 7 天,那么也就是说不管怎样使用,客户每 7 天都必需要登录一次。
但实际中,我们发现很少有这种情况。只要你天天使用,基本不会让你重新登录 那这些网站或 app 是如何做的呢?它们是有一套 refresh token 刷新机制还是其它的方法?
1
sunhuawei 2023-01-31 10:56:38 +08:00 1
在使用 refresh token 刷新的同时,会返回一个新的 refresh token
|
2
andrew2558 OP @sunhuawei 你的意思是指 Access token 每次刷新的同时,也刷新 refresh token 并重新设置 refresh token 的过期时间吗?
|
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 |
4
ttwxdly 2023-01-31 11:04:14 +08:00 1
每次 refresh 后会返回新的 refresh token ,refresh token 的生命周期要比 access token 长。 refresh token 也可以做成重复使用的,但是不推荐。
|
5
0xC000009F 2023-01-31 11:05:12 +08:00 1
如果用的是 Spring Security 的话 AuthorizationServerEndpointsConfigurer.reuseRefreshTokens 可以配置刷新 access token 的时候可以同时刷新 refresh token
|
6
andrew2558 OP 谢谢大家的回答,大家好像说的都是在刷新 access token 时同时更新 refresh token,这里就要一个问题了,如果 refresh token 存储在数据库,那么每次刷新 access token (时间相对较短)也同时刷新 refresh token,那么无疑对服务器是一个很大的开销。
|
7
iX8NEGGn 2023-01-31 12:09:04 +08:00 via iPhone 1
@andrew2558 不是,token 是无状态的,干嘛要存服务端?
|
8
LeegoYih 2023-01-31 12:14:59 +08:00 1
简单做法,每次获取 session 的时候给 access token 续期
|
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 安全, 完全可以设置有效期久一点). |
10
theqiang 2023-01-31 14:00:14 +08:00 1
OP 是不是对 token 有点误解,应该不用存 db 的吧
|
11
centralpark 2023-01-31 14:05:23 +08:00 1
如果用 uuid 这种随机数做 token ,那肯定需要存到数据库,保留有效期和用户 ID 等数据。如果用 jwt 这类使用私钥签名的数据做 token ,那就不需要存出到数据库了,服务端不查库,拿私钥解析出来其中的数据即可。
|
12
andrew2558 OP |
13
iX8NEGGn 2023-01-31 14:16:59 +08:00
@centralpark @andrew2558
Token 这个术语不就是为了和 Session 区分开吗,如果服务端要维护状态那就叫 Session ,而不应该把它归类为 Token 的一种,这就 内存 和 外存 一样,发明这两个术语就是为了做区分,而有的人把 内存 叫做 运行内存,把 外存 叫做 储存内存,我很厌恶这种方式。 |
14
andrew2558 OP @andrew2558 是的,这里指的 refresh token 并不是严格意义上的 jwt, 可以是一个自定义算法生成的字符串
|
15
andrew2558 OP @iX8NEGGn 楼上 @错了
|
16
iX8NEGGn 2023-01-31 14:27:15 +08:00
@centralpark @andrew2558 好吧,久不接触,理解错了,我好像 Token 把 JWT Token 搞混了
|
17
giter 2023-01-31 14:31:07 +08:00 1
accessToken 存用户本地,refreshToken 可以存 Redis 中。accessToken 过期时间很短,refreshToken 过期时间很长。
如果 accessToken 过期而 refreshToken 没有过期,则生成新的 accessToken 发给用户; 如果 accessToken 与 refreshToken 双双过期,则让用户重新登录。 |