118 lines
2.9 KiB
JavaScript
118 lines
2.9 KiB
JavaScript
import login from "~/pages/login.vue";
|
|
|
|
const AUTH_ROUTE = {
|
|
home: '/',
|
|
login: '/login'
|
|
}
|
|
|
|
const COOKIE_OPTIONS = {
|
|
prefix: '_Secure-auth',
|
|
path: '/',
|
|
tokenName: 'access-token',
|
|
refreshTokenName: 'refresh-token',
|
|
}
|
|
|
|
const ENDPOINTS = {
|
|
login: {
|
|
url: '/api/auth/signin'
|
|
},
|
|
refresh: {
|
|
url: '/api/auth/token/refresh'
|
|
},
|
|
logout: {
|
|
url: '/api/auth/signout'
|
|
},
|
|
user: {
|
|
url: '/api/auth/session'
|
|
}
|
|
}
|
|
|
|
|
|
export default defineNuxtPlugin(() => {
|
|
const token = useCookie(COOKIE_OPTIONS.prefix + '.' + COOKIE_OPTIONS.tokenName, {
|
|
maxAge: 60 * 30,
|
|
})
|
|
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() {
|
|
this.loginIn = useState('loginIn', () => false)
|
|
this.user = useState('user')
|
|
}
|
|
|
|
async login () {
|
|
const { data, error } = await useFetch(ENDPOINTS.login.url, {
|
|
method: 'POST',
|
|
body: {
|
|
username: 'admin',
|
|
password: 'admin'
|
|
}
|
|
})
|
|
if (!error.value) {
|
|
token.value = data.value.access
|
|
refreshToken.value = data.value.refresh
|
|
}
|
|
console.log(error.value)
|
|
}
|
|
|
|
logout () {
|
|
this.loginIn.value = false
|
|
this.user.value = null
|
|
}
|
|
|
|
async fetchUser () {
|
|
const { data, error } = await useFetch(ENDPOINTS.user.url, {
|
|
headers: {
|
|
'Authorization': 'Bearer ' + token.value
|
|
}
|
|
})
|
|
if (!error.value) {
|
|
this.user = data.value
|
|
this.loginIn.value = true
|
|
}
|
|
console.log('fetchUser', error.value)
|
|
}
|
|
|
|
async refresh () {
|
|
const { data, error } = await useFetch(ENDPOINTS.refresh.url, {
|
|
method: 'POST',
|
|
body: {
|
|
'refresh': refreshToken.value
|
|
}
|
|
})
|
|
console.log('refresh', data)
|
|
if (!error.value) {
|
|
token.value = data.value.access
|
|
}
|
|
console.log('refresh', error.value)
|
|
}
|
|
|
|
}
|
|
|
|
const auth = new Auth()
|
|
|
|
addRouteMiddleware('auth', async () => {
|
|
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)
|
|
}
|
|
if (!token.value) {
|
|
await auth.refresh()
|
|
}
|
|
await auth.fetchUser()
|
|
}
|
|
})
|
|
|
|
return {
|
|
provide: {
|
|
auth
|
|
}
|
|
}
|
|
}) |