什么是 Refresh Token

什么是 Refresh Token


AccessToken 和 IdToken 是 JSON Web Token (opens new window),有效时间通常较短。通常用户在获取资源的时候需要携带 AccessToken,当 AccessToken 过期后,用户需要获取一个新的 AccessToken。

Refresh Token 用于获取新的 AccessToken。这样可以缩短 AccessToken 的过期时间保证安全,同时又不会因为频繁过期重新要求用户登录。

用户在初次认证时,Refresh Token 会和 AccessToken、IdToken 一起返回。你的应用必须安全地存储 Refresh Token,它的重要性和密码是一样的,因为 Refresh Token 能够一直让用户保持登录。

以下是 Token 端点返回的 Refresh Token:

{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5QXRAP_WttBPAUSqTU5uMXwMafryhGdIcQVsDPcGNgMX6E1jzLA",
  "expires_in": 3600,
  "id_token": "eyJhbGciOiJSUzI1NiIsI1eAmdAs3OnFMU7QuP-XtrbwCZC1gJnteFg",
  "refresh_token": "WPsGJbvpBjqXz6IJIr1UHKyrdVF",
  "scope": "openid profile offline_access phone email",
  "token_type": "Bearer"
}

应用携带 Refresh Token 向 Token 端点发起请求时,Authing 每次都会返回相同的 Refresh Token 和新的 AccessToken、IdToken,直到 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) ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兮++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值