Tengo dos middlewares:
Para hacer que el cierre de sesión funcione, creé una ruta de consulta en el primer middleware (login?logout=true) y cuando el usuario quiere cerrar sesión, el tablero debe redirigirlo a la página de inicio de sesión con esta consulta, aunque no lo hace.
El caso es que cuando realizo la redirección, el método console.log(to) en el primer middleware me imprime:
fullPath: "/panel/propietario"
método de redirección
this.$router.replace({ name: 'login', query: { 'logout': true } })Primer software intermedio
import { authoritiesRoutes } from "~~/middleware/panel" import { useAuthStore } from "~~/store/auth" export default defineNuxtRouteMiddleware(async ({ $pinia }, to, from) => { const token = useCookie('accessToken') console.log(to) if (to.query.logout === 'true') { token.value = null return navigateTo('/login') } if (token.value) { const store = useAuthStore($pinia) await store.retrieveUser(token.value) if (store.user != null) { const permissionLevel = store.getUser.authorities.length const routeName = authoritiesRoutes[permissionLevel] const route = '/' + routeName.replace('-', '/') return route; } } })Segundo software intermedio
import { useAuthStore } from '~~/store/auth' export enum authoritiesRoutes { 'panel' = 1, 'dashboard' = 2, 'dashboard-owner' = 3 } export default defineNuxtRouteMiddleware(async ({ $pinia, $event }, to) => { const token = useCookie('accessToken') if (!token.value) { return navigateTo('/login') } const store = useAuthStore($pinia) await store.retrieveUser(token.value) if (store.user == null) { return navigateTo('/login') } const permissionLevel = authoritiesRoutes[to.name]; if (store.getUser.authorities.length < permissionLevel) { return navigateTo("/login?error=you%20don't%20have%20permission%20to%20watch%20this%20page") } })Descubrí que (async ({ $pinia }, to, from) en el middleware debería ser (async (to, { $pinia }) También descubrí que el método useCookie solo funciona cuando se vuelve a cargar la página, así que hice mi tarea esto camino:
export default defineNuxtRouteMiddleware(async (to, { $pinia }) => { var token = useCookie('accessToken') const store = useAuthStore($pinia) if (to.query.logout === 'true') { if (!token.value) { return navigateTo('/login') } token.value = null if (process.client) { store.logout() } } if (token.value) { await store.retrieveUser(token.value) if (store.user != null) { const permissionLevel = store.getUser.authorities.length const routeName = authoritiesRoutes[permissionLevel] const route = '/' + routeName.replace('-', '/') return route; } } }) created () { if (this.$route.query.logout == 'true') { this.$router.go(0) } }