token续签

token续签

目标

  • token过期401, 强制跳转到登录页, 清空本地和store中的token数据
  • token过期401, 用refresh_token无感知的刷新一个新的token回来
    • 替换旧的token的同时, 继续上次未完成的请求. 用户体验好

步骤

  1. 定义刷新token的接口方法

    // 用户 - 更新token
    export const refreshTokenAPI = () => request({
      url: '/v1_0/authorizations',
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${store.state.refresh_token}`
      }
    })
    
  2. 在响应拦截器401处, 调用重新请求token的接口, 然后同步给vuex和本地

    axios.interceptors.response.use(function (response) { 
      return response
    }, async function (error) {
      if (error.response.status === 401) { // 身份过期
        // token续签方式1:
        // store.commit('setToken', '')
        // router.push({ path: '/login' })
    
        // token续签方式2: refreshToken(用户无感知)
        store.commit('setToken', '')
        const res = await refreshTokenAPI()
        store.commit('setToken', res.data.data.token)
        // 再调用一次未完成的请求啊(用户无感知)
        // error.config 就是上一次axios请求的配置对象
        // console.dir(error.config)
        // 把新的token赋予到下一次axios请求的请求头中
        error.config.headers.Authorization = 'Bearer ' + res.data.data.token
        // return到await的地方
        return ajax(error.config)
      } else {
        return Promise.reject(error)
      }
    })
    

小结

  • token过期, 强制跳转登录
  • token过期, 无感知刷新token, 重新再发起一次请求
JWT (JSON Web Token) 续签是一个涉及到更新 JWT 的过程,通常用于在用户登录认证之后,需要保持会话持续有效的情况下。在这个过程中,系统需要在一定时间过后或当某些条件触发时更新 JWT 中的 `exp`(expiration)字段,使得令牌能够继续在服务器端验证并授权访问。 ### JWToken续签的原理 JWT 包含三个部分: 1. **头部(Header)**:包含了算法信息和 JWT 的类型。 2. **负载(Payload)**:存储了有关用户身份和其他元数据的信息,例如用户的唯一标识符、角色等。 3. **签名(Signature)**:通过使用密钥对前面两部分进行哈希计算生成,用于验证令牌的完整性和真实性。 续签的过程主要包括两个步骤: #### 第一步:更新过期时间 系统检测到需要续签时(如用户活动、定期刷新等),首先会更新负载中的 `exp` 字段。这通常是通过增加当前的时间戳来进行,确保新的 `exp` 时间足够长,足以覆盖期望的有效周期。 #### 第二步:创建新签名 接下来,使用相同的或新的密钥,以及更新后的负载和头信息,重新生成签名。这个过程类似于生成原始 JWT 的过程,目的是确保新的 JWT 能够通过服务器端的安全检查,并保持其安全性。 ### 实现步骤 下面是如何在一个简单的上下文中实现 JWT 续签的一般步骤: 1. **获取旧的 JWT**:从请求的 HTTP Header 或 Cookie 中获取用户的 JWT。 2. **解码 JWT**:使用相应的密钥解码 JWT,提取出有效的负载和头信息。 3. **更新过期时间**:增加一些额外的时间(比如 5 分钟),以得到新的 `exp` 时间戳。 4. **重新构造 JWT**:使用更新后的 `exp` 和原有的其他部分,加上密钥,生成新的签名。 5. **返回新 JWT**:将新的 JWT 发送给客户端,在 HTTP Response 中作为新令牌返回给用户。 6. **保存新 JWT**:更新客户端的存储机制(Cookie 或本地存储)以便后续请求可以利用这一新的令牌。 ### 相关问题: 1. **如何选择合适的过期时间间隔**? - 过期时间的选择应基于应用的需求、性能考量和安全考虑。一般建议采用较低的默认值(如30分钟)并在每次用户活动时进行刷新,同时设置一定的超时时间来处理无效令牌情况。 2. **续签是否总是安全的?** - 续签本身不会导致安全风险,但如果处理不当(如不正确地管理密钥或未加密敏感信息),可能导致安全漏洞。始终确保密钥的安全性,避免直接暴露于客户端或其他不可信任的环境。 3. **续签失败的情况有哪些?** - 续签可能失败的原因包括网络延迟、服务器故障、错误的令牌结构、权限缺失或密钥管理不当等。确保系统的健壮性和容错能力对于维持稳定的服务至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值