You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在应用中存储BearerToken并仅过期时刷新以优化请求流程

缓存BearerToken并按需刷新的可行方案

完全可以通过在应用内存储Token、仅在过期(或即将过期)时刷新的方式优化现有流程,这是调用第三方带认证的REST服务时的标准优化手段,能大幅减少认证服务的请求量,提升整体请求效率。具体实现思路如下:

  • Token存储方式

    • 将获取到的BearerToken与对应的过期时间戳一同存储:单实例应用可以用内存缓存(比如全局变量、本地缓存组件);多实例部署的场景建议用分布式缓存(如Redis),确保所有实例共享有效Token。
    • 敏感环境下需对存储的Token进行加密,防止泄露。
  • 校验与刷新逻辑

    • 每次发起目标接口请求前,先检查缓存中的Token是否存在,以及当前时间是否早于过期时间戳(建议提前5-10分钟刷新,预留网络波动的缓冲空间)。
    • 若Token有效,直接携带它发起请求;若Token不存在、已过期或即将过期,则调用认证服务获取新Token,更新缓存中的Token和过期时间戳后再发起请求。
  • 异常处理补充

    • 即使Token在有效期内,也可能出现被服务端提前吊销的情况(比如权限变更),因此必须处理目标接口返回的401 Unauthorized错误:遇到该错误时,立即清除缓存中的旧Token,重新获取新Token后重试请求(注意控制重试次数,避免死循环)。
  • 伪代码示例

# 内存存储Token及过期时间(单实例场景)
cached_token = None
token_expire_at = 0

def get_valid_token():
    global cached_token, token_expire_at
    now = time.time()
    # 提前10分钟触发刷新,避免刚好过期时请求失败
    if not cached_token or now >= token_expire_at - 600:
        # 调用认证服务获取新Token
        auth_res = call_auth_service()
        cached_token = auth_res["access_token"]
        # 计算过期时间:当前时间 + 3小时(转换为秒)
        token_expire_at = now + 3 * 3600
    return cached_token

def invoke_target_api():
    token = get_valid_token()
    try:
        resp = requests.get(TARGET_API_URL, headers={"Authorization": f"Bearer {token}"})
        resp.raise_for_status()
        return resp.json()
    except requests.exceptions.HTTPError as e:
        if resp.status_code == 401:
            # Token失效,清除缓存后重试一次
            global cached_token, token_expire_at
            cached_token = None
            token_expire_at = 0
            token = get_valid_token()
            return requests.get(TARGET_API_URL, headers={"Authorization": f"Bearer {token}"}).json()
        else:
            raise

这种优化方案能将认证服务的请求频率从“每次目标请求都调用”降低至“每3小时左右一次”,有效减少不必要的网络开销。

内容的提问来源于stack exchange,提问作者Jonathan Luke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:50:36