|
@@ -3,6 +3,7 @@ import { loginRequest, logoutRequest, refreshTokenRequest } from "../api/auth.js
|
|
|
import { setAccessToken, setRefreshCallback, setAuthErrorCallback } from "../api/client.js";
|
|
import { setAccessToken, setRefreshCallback, setAuthErrorCallback } from "../api/client.js";
|
|
|
import { resetChatSingleton } from "./useChat.js";
|
|
import { resetChatSingleton } from "./useChat.js";
|
|
|
import { resetConversasSingleton } from "./useConversas.js";
|
|
import { resetConversasSingleton } from "./useConversas.js";
|
|
|
|
|
+import { resetUsersSingleton } from "./useUsers.js";
|
|
|
|
|
|
|
|
const LOCAL_STORAGE_KEY = "auth.session";
|
|
const LOCAL_STORAGE_KEY = "auth.session";
|
|
|
const SESSION_STORAGE_KEY = "auth.session.temp";
|
|
const SESSION_STORAGE_KEY = "auth.session.temp";
|
|
@@ -48,14 +49,19 @@ const isAuthenticated = computed(() => Boolean(user.value?.Id));
|
|
|
|
|
|
|
|
let _proactiveRefreshTimer = null;
|
|
let _proactiveRefreshTimer = null;
|
|
|
let _refreshInFlight = null;
|
|
let _refreshInFlight = null;
|
|
|
|
|
+let _authEpoch = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
function doRefresh() {
|
|
function doRefresh() {
|
|
|
if (_refreshInFlight) return _refreshInFlight;
|
|
if (_refreshInFlight) return _refreshInFlight;
|
|
|
|
|
+ const epoch = _authEpoch;
|
|
|
_refreshInFlight = (async () => {
|
|
_refreshInFlight = (async () => {
|
|
|
const rt = session.value?.refreshToken;
|
|
const rt = session.value?.refreshToken;
|
|
|
if (!rt) throw new Error("no_refresh_token");
|
|
if (!rt) throw new Error("no_refresh_token");
|
|
|
const result = await refreshTokenRequest({ refreshToken: rt });
|
|
const result = await refreshTokenRequest({ refreshToken: rt });
|
|
|
|
|
+ // logout()/authErrorCallback podem ter rodado enquanto o refresh estava em
|
|
|
|
|
+ // voo — não reaplicar sessão/token de um ciclo de auth que já terminou
|
|
|
|
|
+ if (epoch !== _authEpoch) return result.accessToken;
|
|
|
session.value = {
|
|
session.value = {
|
|
|
...session.value,
|
|
...session.value,
|
|
|
accessToken: result.accessToken,
|
|
accessToken: result.accessToken,
|
|
@@ -98,9 +104,11 @@ function setupAuth() {
|
|
|
setRefreshCallback(doRefresh);
|
|
setRefreshCallback(doRefresh);
|
|
|
|
|
|
|
|
setAuthErrorCallback(() => {
|
|
setAuthErrorCallback(() => {
|
|
|
|
|
+ _authEpoch++;
|
|
|
clearTimeout(_proactiveRefreshTimer);
|
|
clearTimeout(_proactiveRefreshTimer);
|
|
|
resetChatSingleton();
|
|
resetChatSingleton();
|
|
|
resetConversasSingleton();
|
|
resetConversasSingleton();
|
|
|
|
|
+ resetUsersSingleton();
|
|
|
session.value = null;
|
|
session.value = null;
|
|
|
persistSession(null);
|
|
persistSession(null);
|
|
|
setAccessToken(null);
|
|
setAccessToken(null);
|
|
@@ -127,6 +135,7 @@ async function login({ login, senha, rememberMe = false }) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function logout() {
|
|
async function logout() {
|
|
|
|
|
+ _authEpoch++;
|
|
|
clearTimeout(_proactiveRefreshTimer);
|
|
clearTimeout(_proactiveRefreshTimer);
|
|
|
const rt = session.value?.refreshToken;
|
|
const rt = session.value?.refreshToken;
|
|
|
try {
|
|
try {
|
|
@@ -134,6 +143,7 @@ async function logout() {
|
|
|
} finally {
|
|
} finally {
|
|
|
resetChatSingleton();
|
|
resetChatSingleton();
|
|
|
resetConversasSingleton();
|
|
resetConversasSingleton();
|
|
|
|
|
+ resetUsersSingleton();
|
|
|
session.value = null;
|
|
session.value = null;
|
|
|
persistSession(null);
|
|
persistSession(null);
|
|
|
setAccessToken(null);
|
|
setAccessToken(null);
|