Refresh Token介绍

Refresh Token介绍

上篇文章说到Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位,而Token的playload部分一般会存储相关的过期时间,一旦Token过期就会被网关拦截,因此如何设置Token刷新机制也是一个重点。

刷新Token探讨

  1. 过期时间尽量地短 ,过长的过期时间会让系统有长期暴露在接口的风险,理论上过期时间越短越好。但是过短的时间明显会带来不好的用户体验,想象下手机固定十秒钟就会锁屏一次。因此不能Token一过期就让用户重新登录,Token需要在后端或者前端动态刷新。
  2. 将Token存储在服务端 ,在服务器端保存 Token 状态,用户每次操作都会自动刷新(推迟) Token 的过期时间——Session 就是采用这种策略来保持用户登录状态的。然而仍然存在这样一个问题,在前后端分离、单页 App 这些情况下,每秒种可能发起很多次请求,每次都去刷新过期时间会产生非常大的代价。如果 Token 的过期时间被持久化到数据库或文件,代价就更大了。所以通常为了提升效率,减少消耗,会把 Token 的过期时保存在缓存或者内存中。
  3. 使用Refresh Token刷新 服务端不需要刷新 Token 的过期时间,一旦 Token 过期,就反馈给前端,前端使用 Refresh Token 申请一个全新 Token 继续使用。这种方案中,服务端只需要在客户端请求更新 Token 的时候对 Refresh Token 的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。当然 Refresh Token 也是有有效期的,但是这个有效期就可以长一点了,比如,以天为单位的时间。refresh token,也是加密字符串,并且和token是相关联的。相比获取各种资源的token,refresh token的作用仅仅是获取新的token,因此其作用和安全性要求都大为降低,所以其过期时间也可以设置得长一些。

Refresh Token实现原理

  • 在access_token里加入refresh_token标识,给access_token设置短时间的期限(例如一天),给refresh_token设置长时间的期限(例如七天)。当活动用户(拥有access_token)发起request时,在权限验证里,对于requeset的header包含的access_token、refresh_token分别进行验证:

  • 1、access_token没过期,即通过权限验证;

  • 2、access_token过期,refresh_token没过期,则返回权限验证失败,并在返回的response的header中加入标识状态的key,在request方法的catch中通过webException来获取标识的key,获取新的token(包含新的access_token和refresh_token),再次发起请求,并返回给客户端请求结果以及新的token,再在客户端更新公共静态token模型;

  • 3、access_token过期,refresh_token过期即权限验证失败。

Refresh Token生成步骤

  • 一: 生成Token时加入refresh token标志
  • 二:在权限验证环节,对于access_token、refresh_token设置不同时间的期限。再根据判断结果返回状态。
  • 三:生成Token时加入refresh token标志
  • 四:生成Token时加入refresh token标志

具体代码格式与参考博客

### refresh token 的实现方式及流程 在现代身份验证体系中,`refresh token` 是一种用于重新获取有效 `access token` 的机制。以下是关于如何通过 `refresh token` 实现 `token` 刷新的具体方法及其工作流程: #### 1. 基本概念 - **Access Token**: 通常是一个短生命周期的令牌,客户端可以使用它来访问受保护资源[^1]。 - **Refresh Token**: 通常是长生命周期的令牌,允许客户端在不重新登录的情况下获得新的 `access token`。 #### 2. 工作原理 当用户的 `access token` 即将过期时,客户端可以通过发送有效的 `refresh token` 来向授权服务器请求一个新的 `access token`。在此过程中,服务器可能会返回一个新的 `refresh token` 或继续沿用旧的 `refresh token`,具体取决于配置和安全策略[^2]。 #### 3. 请求过程 以下是基于 OAuth 2.0 标准的一个典型刷新流程: ##### (a) 客户端准备 客户端需要保存两个重要数据: - 当前的有效 `refresh token` - 授权服务器地址(即 `/token` 端点) ##### (b) 发送请求 客户端向授权服务器发出 POST 请求,传递必要的参数。以下是一个标准的 HTTP 请求示例: ```http POST /oauth/token HTTP/1.1 Host: authorization-server.com Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&client_id=your_client_id&client_secret=your_client_secret&refresh_token=existing_refresh_token ``` 其中: - `grant_type`: 设置为 `refresh_token` 表明这是一个刷新请求。 - `client_id` 和 `client_secret`: 应用程序的身份凭证。 - `refresh_token`: 需要使用的现有 `refresh token`。 ##### (c) 服务端处理 授权服务器接收到请求后会执行以下操作: 1. 验证传入的 `refresh token` 是否合法且未被吊销。 2. 如果合法,则生成并返回一个新的 `access token` 及可能的新 `refresh token`。 ##### (d) 返回响应 如果一切正常,服务器将以 JSON 格式返回如下结构的数据: ```json { "access_token": "new_access_token", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "optional_new_refresh_token" } ``` 字段说明: - `access_token`: 新生成的短期令牌。 - `token_type`: 令牌类型,一般为 Bearer。 - `expires_in`: 访问令牌有效期(秒数)。 - `refresh_token`: (可选)新生成的长期令牌。 #### 4. 安全注意事项 为了防止恶意攻击者滥用 `refresh token`,应采取以下措施: - 使用 HTTPS 加密通信以保障传输安全性。 - 对 `refresh token` 设定合理的生存周期,并定期轮换。 - 在检测到异常行为时立即撤销对应的 `refresh token`[^3]。 --- ### 示例代码 下面是一段简单的 Python 脚本演示如何利用 `requests` 库完成一次 `refresh token` 请求: ```python import requests def refresh_tokens(refresh_token, client_id, client_secret): url = 'https://authorization-server.com/oauth/token' payload = { 'grant_type': 'refresh_token', 'client_id': client_id, 'client_secret': client_secret, 'refresh_token': refresh_token } response = requests.post(url, data=payload) if response.status_code == 200: tokens = response.json() return tokens['access_token'], tokens.get('refresh_token') else: raise Exception(f"Failed to refresh token: {response.text}") # Example usage try: new_access_token, new_refresh_token = refresh_tokens( refresh_token='old_refresh_token', client_id='app_client_id', client_secret='app_client_secret' ) print("New Access Token:", new_access_token) except Exception as e: print(e) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值