init
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
import {defineStore} from 'pinia'
|
||||
|
||||
interface UserClaims {
|
||||
user_id: string
|
||||
username: string
|
||||
is_admin: boolean // On s'assure que le backend l'envoie ou on le déduit
|
||||
exp: number
|
||||
}
|
||||
|
||||
export const useAuthStore = defineStore('auth', {
|
||||
state: () => ({
|
||||
token: localStorage.getItem('token') || null as string | null,
|
||||
user: JSON.parse(localStorage.getItem('user') || 'null') as UserClaims | null,
|
||||
}),
|
||||
getters: {
|
||||
isAuthenticated: (state) => !!state.token,
|
||||
isAdmin: (state) => state.user?.is_admin || false,
|
||||
},
|
||||
actions: {
|
||||
setToken(token: string) {
|
||||
this.token = token
|
||||
localStorage.setItem('token', token)
|
||||
|
||||
try {
|
||||
// Décoder le payload du JWT (2ème partie du string)
|
||||
const base64Url = token.split('.')[1]
|
||||
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/')
|
||||
const jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
|
||||
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
|
||||
}).join(''))
|
||||
|
||||
const decoded = JSON.parse(jsonPayload)
|
||||
this.user = {
|
||||
user_id: decoded.user_id,
|
||||
username: decoded.username,
|
||||
is_admin: decoded.is_superuser || false, // Vérifiez le nom du champ dans votre Claims Rust
|
||||
exp: decoded.expire_at
|
||||
}
|
||||
localStorage.setItem('user', JSON.stringify(this.user))
|
||||
} catch (e) {
|
||||
console.error("Failed to decode token", e)
|
||||
this.logout()
|
||||
}
|
||||
},
|
||||
logout() {
|
||||
this.token = null
|
||||
this.user = null
|
||||
localStorage.removeItem('token')
|
||||
localStorage.removeItem('user')
|
||||
}
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user