From 3e46512c156e27eba56204027c9db22b5c2e6963 Mon Sep 17 00:00:00 2001 From: Rafi Date: Wed, 22 Feb 2023 16:50:53 +0800 Subject: [PATCH] feat: auth plugin --- composables/useAuthFetch.js | 21 ++++++++++ layouts/vuetifyApp.vue | 7 ++++ pages/login.vue | 84 +++++++++++++++++++++++++++++++++---- pages/test.vue | 72 ------------------------------- plugins/auth.js | 66 ++++++++++++++++------------- 5 files changed, 143 insertions(+), 107 deletions(-) create mode 100644 composables/useAuthFetch.js create mode 100644 layouts/vuetifyApp.vue delete mode 100644 pages/test.vue diff --git a/composables/useAuthFetch.js b/composables/useAuthFetch.js new file mode 100644 index 0000000..9e95d4a --- /dev/null +++ b/composables/useAuthFetch.js @@ -0,0 +1,21 @@ +export const useAuthFetch = async (url, options = {}) => { + const { $auth } = useNuxtApp() + + const token = await $auth.retrieveToken() + + if (!token) { + return await $auth.redirectToLogin() + } + + options = Object.assign(options, { + headers: { + 'Authorization': 'Bearer ' + token + } + }) + + const res = await useFetch(url, options) + if (res.error.value && res.error.value.status === 401) { + await $auth.logout() + } + return res +} diff --git a/layouts/vuetifyApp.vue b/layouts/vuetifyApp.vue new file mode 100644 index 0000000..d081486 --- /dev/null +++ b/layouts/vuetifyApp.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/pages/login.vue b/pages/login.vue index ba6f06a..7676a39 100644 --- a/pages/login.vue +++ b/pages/login.vue @@ -1,17 +1,87 @@ \ No newline at end of file diff --git a/pages/test.vue b/pages/test.vue deleted file mode 100644 index fc0182e..0000000 --- a/pages/test.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - \ No newline at end of file diff --git a/plugins/auth.js b/plugins/auth.js index a4fa371..2452c2f 100644 --- a/plugins/auth.js +++ b/plugins/auth.js @@ -1,4 +1,3 @@ -import login from "~/pages/login.vue"; const AUTH_ROUTE = { home: '/', @@ -19,9 +18,6 @@ const ENDPOINTS = { refresh: { url: '/api/auth/token/refresh' }, - logout: { - url: '/api/auth/signout' - }, user: { url: '/api/auth/session' } @@ -35,8 +31,6 @@ export default defineNuxtPlugin(() => { const refreshToken = useCookie(COOKIE_OPTIONS.prefix + '.' + COOKIE_OPTIONS.refreshTokenName, { maxAge: 60 * 60 * 24, }) - console.log('token', token.value) - console.log('refreshToken', refreshToken.value) class Auth { constructor() { @@ -44,37 +38,39 @@ export default defineNuxtPlugin(() => { this.user = useState('user') } - async login () { + async login (username, password) { const { data, error } = await useFetch(ENDPOINTS.login.url, { method: 'POST', body: { - username: 'admin', - password: 'admin' + username, + password } }) if (!error.value) { token.value = data.value.access refreshToken.value = data.value.refresh + return null } - console.log(error.value) + if (error.value.status === 401) { + return error.value.data.detail + } + return 'Request failed, please try again.' } - logout () { + async logout () { this.loginIn.value = false this.user.value = null + await this.redirectToLogin() } async fetchUser () { - const { data, error } = await useFetch(ENDPOINTS.user.url, { - headers: { - 'Authorization': 'Bearer ' + token.value - } - }) + const { data, error } = await useAuthFetch(ENDPOINTS.user.url) if (!error.value) { this.user = data.value this.loginIn.value = true + return null } - console.log('fetchUser', error.value) + return error } async refresh () { @@ -84,29 +80,43 @@ export default defineNuxtPlugin(() => { 'refresh': refreshToken.value } }) - console.log('refresh', data) if (!error.value) { token.value = data.value.access } - console.log('refresh', error.value) + } + + async callback () { + return await navigateTo(AUTH_ROUTE.home) + } + + async redirectToLogin () { + return await navigateTo(AUTH_ROUTE.login) + } + + async retrieveToken () { + if (!refreshToken.value) { + return null + } + if (!token.value) { + await this.refresh() + } + return token.value || null } } const auth = new Auth() - addRouteMiddleware('auth', async () => { + addRouteMiddleware('auth', async (to, from) => { if (!auth.loginIn.value) { - console.log('check', token.value, refreshToken.value) - // Refresh token has expired - if (!refreshToken.value) { - console.log('refreshToken expired') - return navigateTo(AUTH_ROUTE.login) + const token = await auth.retrieveToken() + if (!token) { + return await auth.redirectToLogin() } - if (!token.value) { - await auth.refresh() + const error = await auth.fetchUser() + if (error) { + return await auth.redirectToLogin() } - await auth.fetchUser() } })