71 lines
1.5 KiB
JavaScript
71 lines
1.5 KiB
JavaScript
|
|
const AUTH_ROUTE = {
|
|
home: '/',
|
|
login: '/account/signin',
|
|
}
|
|
|
|
const ENDPOINTS = {
|
|
login: {
|
|
url: '/api/account/login/'
|
|
},
|
|
user: {
|
|
url: '/api/account/user/'
|
|
}
|
|
}
|
|
|
|
|
|
export default defineNuxtPlugin(() => {
|
|
|
|
class Auth {
|
|
constructor() {
|
|
this.loginIn = useState('loginIn', () => false)
|
|
this.user = useState('user')
|
|
}
|
|
|
|
async logout () {
|
|
this.loginIn.value = false
|
|
this.user.value = null
|
|
await this.redirectToLogin()
|
|
}
|
|
|
|
setUser (user) {
|
|
this.user = user
|
|
this.loginIn.value = true
|
|
}
|
|
|
|
async fetchUser () {
|
|
const { data, error } = await useFetch(ENDPOINTS.user.url, {
|
|
// withCredentials: true
|
|
})
|
|
if (!error.value) {
|
|
this.setUser(data.value)
|
|
return null
|
|
}
|
|
return error
|
|
}
|
|
|
|
async redirectToLogin (callback) {
|
|
return await navigateTo(
|
|
AUTH_ROUTE.login + '?callback=' + encodeURIComponent(callback || AUTH_ROUTE.home)
|
|
)
|
|
}
|
|
|
|
}
|
|
|
|
const auth = new Auth()
|
|
|
|
addRouteMiddleware('auth', async (to, from) => {
|
|
if (!auth.loginIn.value) {
|
|
const error = await auth.fetchUser()
|
|
if (error) {
|
|
return await auth.redirectToLogin(to.fullPath)
|
|
}
|
|
}
|
|
})
|
|
|
|
return {
|
|
provide: {
|
|
auth
|
|
}
|
|
}
|
|
}) |