使用axios结合access_token和refresh_token进行无感刷新

本文介绍了如何在Vue应用中使用axios进行HTTP请求,包括设置请求头、处理401响应(token失效)时自动保存配置并刷新令牌,确保请求连续性。
摘要由CSDN通过智能技术生成

这里利用到的主要是 axios 请求失败的config配置可以记住本次请求的参数,以及利用拦截器,等待刷新完后通过 axios(config) 再次发起请求。
小技巧:将每次请求失败的config和promise的resolve参数存放到数组中,等待刷新token完成再次请求

<script setup lang="ts">
import { RouterLink, RouterView } from 'vue-router'
import HelloWorld from './components/HelloWorld.vue'
import axios, { type InternalAxiosRequestConfig } from 'axios'
import { ref } from 'vue'

let isRefreshing = false // 标志是否正在刷新token
let requestQueue: { config: InternalAxiosRequestConfig; resolve: any }[] = [] // 存放token失效的请求配置的promise的resolve方法

axios.interceptors.request.use((config) => {
  config.headers.Authorization = 'bearer ' + localStorage.getItem('access_token') || '' //拦截器添加token请求头
  return config
})
axios.interceptors.response.use(
  (res) => {
    return res
  },
  async (err) => {
    const { config, response } = err
    if (response.status == 401 && !config.url.endsWith('/login')) {
      // eslint-disable-next-line no-async-promise-executor
      return new Promise(async (resolve) => {
        requestQueue.push({ config, resolve }) // accessToken失效后并发请求时,都会失败,把所有的config存起来,刷新完token再请求
        if (isRefreshing) {
          return
        }

        isRefreshing = true
        await refreshToken() // 使用refreshToken拿到新的有效的accessToken和refreshToken,存放到loalStorage中
        isRefreshing = false
        for (const { resolve, config } of requestQueue) {
          resolve(axios(config)) //这里请求失败拿到请求的config,才能重发请求
        }
      })
    }
    return Promise.reject(err)
  }
)

const refreshToken = async () => {
  const { data } = await axios.get('http://localhost:3000/refreshToken', {
    params: {
      refresh_token: localStorage.getItem('refresh_token')
    }
  })

  if (data.accessToken && data.refreshToken) {
    localStorage.setItem('access_token', data.accessToken)
    localStorage.setItem('refresh_token', data.refreshToken)
  }
}

const testData1 = ref()
const testData2 = ref()

const query = async () => {
  axios.get('http://localhost:3000/test1').then((res) => {
    testData1.value = res.data
  })
  axios.get('http://localhost:3000/test2').then((res) => {
    testData2.value = res.data
  })
}

const login = async () => {
  const { data } = await axios.get('http://localhost:3000/login')

  localStorage.setItem('access_token', data.accessToken)
  localStorage.setItem('refresh_token', data.refreshToken)
}
</script>

<template>
  <button @click="login">登录</button>
  <button @click="query()">请求</button>
  <div>
    <h1>{{ testData1 }}</h1>
    <h1>{{ testData2 }}</h1>
  </div>
</template>

<style scoped></style>

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
axios是一个非常流行的JavaScript库,用于在浏览器和Node.js中发送HTTP请求。它提供了许多功能和选项,包括“无痛刷新token”。 在前后端分离的应用程序中,通常需要使用身份认证来验证用户。当用户成功登录后,服务器会颁发一个访问令牌(token)。然而,这个令牌只有一个有限的有效期,一旦过期,用户再次访问受保护的资源时就必须重新登录。 为了避免用户频繁重新登录,我们可以使用“无痛刷新token”的方法。具体实现的步骤如下: 1. 客户端(浏览器或移动应用)在每次请求中将token作为Authorization头的一部分发送给服务器。 2. 服务器通过中间件验证token的有效性。如果token已过期,服务器将返回一个特定的HTTP状态码(比如401)和一个响应体,指示客户端token过期。 3. 在客户端的axios请求拦截器中,我们可以通过检查响应状态码来确定是否需要刷新token。 4. 如果服务器返回的状态码为401,表示token过期,客户端就需要重新获取新的token。 5. 我们可以通过使用Refresh Token刷新token)的方式来获取新的token。这个Refresh Token是在用户登录时服务器颁发的。 6. 客户端发送一个特定的刷新token的请求到服务器,服务器验证该token的有效性,如果有效则颁发新的访问令牌。 7. 客户端在收到新的访问令牌后,可以更新存储在浏览器或应用程序中的token,并使用这个新的token继续发送请求。 通过以上步骤,我们实现了“无痛刷新token”的功能。客户端能够在token过期时自动获取新的token,而不需要用户重新登录,从而提供了更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值