ffplayout/stores/auth.ts

95 lines
2.7 KiB
TypeScript
Raw Normal View History

2023-01-11 10:54:25 +01:00
import { defineStore } from 'pinia'
import jwtDecode, { JwtPayload } from 'jwt-decode'
2023-09-26 09:29:46 +02:00
interface JwtPayloadExt extends JwtPayload {
role: string
}
2023-01-11 10:54:25 +01:00
export const useAuth = defineStore('auth', {
state: () => ({
isLogin: false,
jwtToken: '',
authHeader: {},
2023-09-26 09:29:46 +02:00
role: '',
2023-01-11 10:54:25 +01:00
}),
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}` }
},
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/', {
2023-01-11 10:54:25 +01:00
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)
2023-09-26 09:29:46 +02:00
const decodedToken = jwtDecode<JwtPayloadExt>(response.user.token)
this.isLogin = true
this.role = decodedToken.role
2023-01-11 10:54:25 +01:00
})
.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)
2023-09-26 09:29:46 +02:00
const decodedToken = jwtDecode<JwtPayloadExt>(token)
2023-01-11 10:54:25 +01:00
const timestamp = Date.now() / 1000
const expireToken = decodedToken.exp
2023-09-26 09:29:46 +02:00
this.role = decodedToken.role
2023-01-11 10:54:25 +01:00
if (expireToken && this.jwtToken && expireToken - timestamp > 15) {
2023-09-26 09:29:46 +02:00
this.isLogin = true
2023-01-11 10:54:25 +01:00
} else {
// Prompt user to re login.
2023-09-26 09:29:46 +02:00
this.isLogin = false
2023-01-11 10:54:25 +01:00
}
} else {
2023-09-26 09:29:46 +02:00
this.isLogin = false
2023-01-11 10:54:25 +01:00
}
},
},
})