nuxt 自定义 auth 中间件实现令牌的持久化
核心点就是在process.server
下,把之前存在 cookie 中的数据再用store.commit
一下
auth.js
1 | /* eslint-disable no-unused-vars */ |
2 | /* eslint-disable no-useless-return */ |
3 | |
4 | export const TokenKey = 'Admin-token' |
5 | |
6 | /** |
7 | * 解析服务端拿到的cookie |
8 | * @param {*} cookie |
9 | * @param {*} key |
10 | */ |
11 | export function getCookie(cookie, key) { |
12 | if (!cookie) return |
13 | const arrstr = cookie.split('; ') |
14 | for (let i = 0; i < arrstr.length; i++) { |
15 | const temp = arrstr[i].split('=') |
16 | |
17 | if (temp[0] === key) return unescape(temp[1]) |
18 | } |
19 | } |
20 | |
21 | // 登录页 |
22 | const loginPath = '/login' |
23 | // 首页 |
24 | const indexPath = '/home' |
25 | // 路由白名单,直接绕过路由守卫 |
26 | const whiteList = [loginPath] |
27 | |
28 | /** |
29 | * @description 鉴权中间件,用于校验登陆 |
30 | * |
31 | */ |
32 | export default async ({ store, redirect, env, route, req }) => { |
33 | const { path, fullPath, query } = route |
34 | const { redirect: redirectPath } = query |
35 | |
36 | // 应对刷新 vuex状态丢失的解决方案 |
37 | if (process.server) { |
38 | const cookie = req.headers.cookie |
39 | const token = getCookie(cookie, TokenKey) |
40 | |
41 | // 设置登录状态 |
42 | if (token) { |
43 | store.commit('LOGIN', token) //'LOGIN' 和store中的mutations对应起来就可以了 |
44 | } |
45 | |
46 | if (token) { |
47 | // 已经登录,进来的是登录页,且有重定向的路径,直接调跳到重定向的路径 |
48 | if (path === loginPath && path !== redirectPath) { |
49 | redirect(redirectPath) |
50 | } else if (path === '/') { |
51 | redirect(indexPath) |
52 | } else { |
53 | // 其他的已经登录过得直接跳过 |
54 | return |
55 | } |
56 | } else { |
57 | // 鉴权白名单 |
58 | if (whiteList.includes(path)) return |
59 | |
60 | // 未登录,进来的不是是登录页,全部重定向到登录页 |
61 | if (!path.includes(loginPath)) { |
62 | redirect(`${loginPath}?redirect=${encodeURIComponent(fullPath)}`) |
63 | } |
64 | } |
65 | } |
66 | } |