后台项目 Express-Mysql-Vue3-TS-Pinia 前端token

182 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

后台项目 Express-Mysql-Vue3-Ts-Pinia 前端token

引言

通过之前一段时间 ExpressMysql 的学习

这里尝试来搭建一个 后台系统 来巩固下学习的技术。

前端处理token

上一节,我们将 后端处理 token 的逻辑已经处理完毕。

现在开始处理前端逻辑。

首先需要设置一个 token 的函数。

const setToken = (token) => {
  setStorage({
    key: ACCESS_TOKEN,
    value: token
  })
}

之后我们知道,只有在登录成功后,才能获取 token,并且跳转到工作台首页。

await userLogin({
    username: ruleForm.username,
    password: CryptoJS.MD5(ruleForm.password).toString()
  })
    .then((res) => {
      const { flag, message, token } = res.data

      if (flag) {
        ElMessage({
          type: 'success',
          message
        })

        // 请求
        setToken(token)

        router.push('/workbench')
      } else {
        ElMessage.error(message)
      }
    })
    .catch((err) => {
      console.log('err', err)
    })

这样的话,前端成功获取到 token,并保存到本地的 localstorage 中,但是问题还没有结束。

我们希望的是,每次请求都要携带这个 token,那么就需要修改我们的 axios,即 前置守卫

前置守卫 当中,我们请求之前,需要获取本地的 token 值,如果存在 token 的话,我们将该 token的值放到 headers 中。

这样的话,也和我们的后端相通了,获取的都是 headers.authorization

service.interceptors.request.use(
  (config: any) => {
    console.log(config, 'config')

    const { get: getStorage } = useStorage()

    const token = getStorage(ACCESS_TOKEN)

    if (token) {
      config.headers.authorization = token
    }

    return config
  },
  (error) => {
    // return Promise.reject(error);
    console.log('error', error)
    return error
  }
)

通过上面的步骤,我们可以成功的登录并且跳转到首页。

image.png

此时还有个问题,需要测试我们的 token 确实已经在每个请求发起后,headers.authorization 中是我们的 token

我们快速模拟一个 test 测试,后端也将接口写好

image.png

image.png

可以看到在我们成功登陆后,工作台发起一个 test 请求,就可以看到请求的 headers 中存在 token 的值

image.png

总结

通过 Express-Mysql-Vue3-TS-Pinia 做出一个 后台系统 项目,前端处理 token 的逻辑。