fix: session F5 + token/password modifiables dans les paramètres
Session F5 : - auth.store: restoreSession() essaie fetchMe() avec le token existant (< 15 min → fonctionne sans cookie), puis tryRefresh() en fallback - router: appelle restoreSession() au premier chargement au lieu de tryRefresh() Paramètres infrastructure : - Champs ssh_password et proxmox_token en write-only (vide = pas de changement) - SettingsHandler: accepte les clés chiffrées, chiffre avant stockage - Permet de corriger le token Proxmox invalide sans réinstallation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
1886071922
commit
d55ecdcd97
7 changed files with 111 additions and 16 deletions
|
|
@ -70,9 +70,45 @@ export const useAuthStore = defineStore('auth', () => {
|
|||
scheduleRefresh(14 * 60 * 1000)
|
||||
}
|
||||
|
||||
/**
|
||||
* Restaure la session au démarrage de l'application (après F5).
|
||||
* 1. Essaie fetchMe() avec le token existant (marche si < 15 min)
|
||||
* 2. Si le token est expiré, tente le refresh via le cookie httpOnly
|
||||
*/
|
||||
async function restoreSession(): Promise<void> {
|
||||
if (!accessToken.value) return
|
||||
|
||||
// Le token est peut-être encore valide : évite d'avoir besoin du cookie
|
||||
await fetchMe()
|
||||
if (user.value) {
|
||||
scheduleRefresh(14 * 60 * 1000)
|
||||
return
|
||||
}
|
||||
|
||||
// Token expiré — tenter le refresh via le cookie httpOnly
|
||||
try {
|
||||
const res = await fetch('/api/auth/refresh', {
|
||||
method: 'POST',
|
||||
credentials: 'include',
|
||||
})
|
||||
if (res.ok) {
|
||||
const data = await res.json()
|
||||
accessToken.value = data.access_token
|
||||
localStorage.setItem('pxp_token', data.access_token)
|
||||
await fetchMe()
|
||||
if (user.value) scheduleRefresh(14 * 60 * 1000)
|
||||
} else {
|
||||
// Le refresh a explicitement échoué (cookie absent ou expiré)
|
||||
clearSession()
|
||||
}
|
||||
} catch {
|
||||
// Erreur réseau transitoire — ne pas effacer le token, laisser le guard rediriger
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tente de renouveler le token via le cookie httpOnly (pxp_refresh).
|
||||
* Appelé au démarrage de l'application.
|
||||
* Utilisé par le timer automatique (14 min après login).
|
||||
*/
|
||||
async function tryRefresh(): Promise<void> {
|
||||
const token = localStorage.getItem('pxp_token')
|
||||
|
|
@ -81,19 +117,16 @@ export const useAuthStore = defineStore('auth', () => {
|
|||
try {
|
||||
const res = await fetch('/api/auth/refresh', {
|
||||
method: 'POST',
|
||||
credentials: 'include', // Inclure le cookie httpOnly
|
||||
credentials: 'include',
|
||||
})
|
||||
|
||||
if (res.ok) {
|
||||
const data = await res.json()
|
||||
accessToken.value = data.access_token
|
||||
localStorage.setItem('pxp_token', data.access_token)
|
||||
|
||||
// Charger le profil utilisateur
|
||||
await fetchMe()
|
||||
scheduleRefresh(14 * 60 * 1000)
|
||||
} else {
|
||||
// Refresh échoué — nettoyer la session
|
||||
clearSession()
|
||||
}
|
||||
} catch {
|
||||
|
|
@ -177,6 +210,7 @@ export const useAuthStore = defineStore('auth', () => {
|
|||
checkInstallation,
|
||||
login,
|
||||
logout,
|
||||
restoreSession,
|
||||
tryRefresh,
|
||||
fetchMe,
|
||||
updatePreferences,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue