nuxt 自定义 auth 中间件实现令牌的持久化

6 篇文章 0 订阅
1 篇文章 0 订阅

nuxt 自定义 auth 中间件实现令牌的持久化

核心点就是在process.server下,把之前存在 cookie 中的数据再用store.commit一下

auth.js

/* eslint-disable no-unused-vars */
/* eslint-disable no-useless-return */

export const TokenKey = 'Admin-token'

/**
 * 解析服务端拿到的cookie
 * @param {*} cookie
 * @param {*} key
 */
export function getCookie(cookie, key) {
  if (!cookie) return
  const arrstr = cookie.split('; ')
  for (let i = 0; i < arrstr.length; i++) {
    const temp = arrstr[i].split('=')

    if (temp[0] === key) return unescape(temp[1])
  }
}

// 登录页
const loginPath = '/login'
// 首页
const indexPath = '/home'
// 路由白名单,直接绕过路由守卫
const whiteList = [loginPath]

/**
 * @description  鉴权中间件,用于校验登陆
 *
 */
export default async ({ store, redirect, env, route, req }) => {
  const { path, fullPath, query } = route
  const { redirect: redirectPath } = query

  // 应对刷新 vuex状态丢失的解决方案
  if (process.server) {
    const cookie = req.headers.cookie
    const token = getCookie(cookie, TokenKey)

    // 设置登录状态
    if (token) {
      store.commit('LOGIN', token) //'LOGIN' 和store中的mutations对应起来就可以了
    }

    if (token) {
      // 已经登录,进来的是登录页,且有重定向的路径,直接调跳到重定向的路径
      if (path === loginPath && path !== redirectPath) {
        redirect(redirectPath)
      } else if (path === '/') {
        redirect(indexPath)
      } else {
        // 其他的已经登录过得直接跳过
        return
      }
    } else {
      // 鉴权白名单
      if (whiteList.includes(path)) return

      // 未登录,进来的不是是登录页,全部重定向到登录页
      if (!path.includes(loginPath)) {
        redirect(`${loginPath}?redirect=${encodeURIComponent(fullPath)}`)
      }
    }
  }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xiaofei0627

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

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

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

打赏作者

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

抵扣说明:

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

余额充值