91 lines
2.5 KiB
TypeScript
91 lines
2.5 KiB
TypeScript
|
import { defineStore } from 'pinia'
|
||
|
import jwtDecode, { JwtPayload } from 'jwt-decode'
|
||
|
|
||
|
export const useAuth = defineStore('auth', {
|
||
|
state: () => ({
|
||
|
isLogin: false,
|
||
|
jwtToken: '',
|
||
|
authHeader: {},
|
||
|
}),
|
||
|
|
||
|
getters: {},
|
||
|
actions: {
|
||
|
updateToken(token: string) {
|
||
|
const cookie = useCookie('token', {
|
||
|
path: '/',
|
||
|
maxAge: 60 * 60 * 24 * 365,
|
||
|
sameSite: 'lax',
|
||
|
})
|
||
|
|
||
|
cookie.value = token
|
||
|
this.jwtToken = token
|
||
|
this.authHeader = { Authorization: `Bearer ${token}` }
|
||
|
},
|
||
|
|
||
|
updateIsLogin(bool: boolean) {
|
||
|
this.isLogin = bool
|
||
|
},
|
||
|
|
||
|
removeToken() {
|
||
|
const cookie = useCookie('token')
|
||
|
cookie.value = null
|
||
|
this.jwtToken = ''
|
||
|
this.authHeader = {}
|
||
|
},
|
||
|
|
||
|
async obtainToken(username: string, password: string) {
|
||
|
let code = 0
|
||
|
const payload = {
|
||
|
username,
|
||
|
password,
|
||
|
}
|
||
|
|
||
|
await fetch('auth/login/', {
|
||
|
method: 'POST',
|
||
|
headers: new Headers([['content-type', 'application/json;charset=UTF-8']]),
|
||
|
body: JSON.stringify(payload),
|
||
|
})
|
||
|
.then((response) => {
|
||
|
code = response.status
|
||
|
return response
|
||
|
})
|
||
|
.then((response) => response.json())
|
||
|
.then((response) => {
|
||
|
this.updateToken(response.user.token)
|
||
|
this.updateIsLogin(true)
|
||
|
})
|
||
|
.catch((error) => {
|
||
|
if (error.status) {
|
||
|
code = error.status
|
||
|
}
|
||
|
})
|
||
|
|
||
|
return code
|
||
|
},
|
||
|
|
||
|
inspectToken() {
|
||
|
let token = useCookie('token').value
|
||
|
|
||
|
if (token === null) {
|
||
|
token = ''
|
||
|
}
|
||
|
|
||
|
if (token) {
|
||
|
this.updateToken(token)
|
||
|
const decodedToken = jwtDecode<JwtPayload>(token)
|
||
|
const timestamp = Date.now() / 1000
|
||
|
const expireToken = decodedToken.exp
|
||
|
|
||
|
if (expireToken && this.jwtToken && expireToken - timestamp > 15) {
|
||
|
this.updateIsLogin(true)
|
||
|
} else {
|
||
|
// Prompt user to re login.
|
||
|
this.updateIsLogin(false)
|
||
|
}
|
||
|
} else {
|
||
|
this.updateIsLogin(false)
|
||
|
}
|
||
|
},
|
||
|
},
|
||
|
})
|