salix-front/src/composables/useSession.js

166 lines
4.9 KiB
JavaScript
Raw Normal View History

2022-03-24 15:49:33 +00:00
import { useState } from './useState';
import { useRole } from './useRole';
import { useAcl } from './useAcl';
import { useUserConfig } from './useUserConfig';
import axios from 'axios';
import useNotify from './useNotify';
2024-04-19 10:26:43 +00:00
import { useTokenConfig } from './useTokenConfig';
const TOKEN_MULTIMEDIA = 'tokenMultimedia';
const TOKEN = 'token';
2022-03-24 15:49:33 +00:00
export function useSession() {
const { notify } = useNotify();
2024-04-19 10:26:43 +00:00
let isCheckingToken = false;
2024-04-22 05:37:35 +00:00
let intervalId = null;
2022-03-24 15:49:33 +00:00
function getToken() {
const localToken = localStorage.getItem(TOKEN);
const sessionToken = sessionStorage.getItem(TOKEN);
2022-03-24 15:49:33 +00:00
return localToken || sessionToken || '';
}
function getTokenMultimedia() {
const localTokenMultimedia = localStorage.getItem(TOKEN_MULTIMEDIA);
const sessionTokenMultimedia = sessionStorage.getItem(TOKEN_MULTIMEDIA);
return localTokenMultimedia || sessionTokenMultimedia || '';
}
2022-03-24 15:49:33 +00:00
2024-04-22 05:37:35 +00:00
function setSession(data) {
let keepLogin = data.keepLogin;
2024-04-19 10:26:43 +00:00
const storage = keepLogin ? localStorage : sessionStorage;
storage.setItem(TOKEN, data.token);
storage.setItem(TOKEN_MULTIMEDIA, data.tokenMultimedia);
2024-04-22 05:37:35 +00:00
storage.setItem('created', data.created);
storage.setItem('ttl', data.ttl);
2024-04-19 10:26:43 +00:00
sessionStorage.setItem('keepLogin', keepLogin);
2022-03-24 15:49:33 +00:00
}
2024-04-22 05:37:35 +00:00
function keepLogin() {
return sessionStorage.getItem('keepLogin');
}
function setToken({ token, tokenMultimedia }) {
const storage = keepLogin() ? localStorage : sessionStorage;
storage.setItem(TOKEN, token);
storage.setItem(TOKEN_MULTIMEDIA, tokenMultimedia);
}
async function destroyToken(url, storage, key) {
if (storage.getItem(key)) {
try {
await axios.post(url, null, {
headers: { Authorization: storage.getItem(key) },
});
} catch (error) {
2024-03-15 11:43:56 +00:00
notify('errors.statusUnauthorized', 'negative');
} finally {
storage.removeItem(key);
}
}
}
async function destroy() {
const tokens = {
tokenMultimedia: 'Accounts/logout',
token: 'VnUsers/logout',
};
2024-04-22 05:37:35 +00:00
const storage = keepLogin() ? localStorage : sessionStorage;
for (const [key, url] of Object.entries(tokens)) {
2024-04-22 05:37:35 +00:00
await destroyToken(url, storage, key);
}
2024-04-22 05:37:35 +00:00
localStorage.clear();
sessionStorage.clear();
2022-03-24 15:49:33 +00:00
const { setUser } = useState();
setUser({
id: 0,
name: '',
2022-03-24 15:49:33 +00:00
nickname: '',
lang: '',
darkMode: null,
2022-03-24 15:49:33 +00:00
});
2024-04-19 10:26:43 +00:00
stopRenewer();
2022-03-24 15:49:33 +00:00
}
2024-04-22 05:37:35 +00:00
async function login(data) {
setSession(data);
await useRole().fetch();
await useAcl().fetch();
await useUserConfig().fetch();
2024-04-19 10:26:43 +00:00
await useTokenConfig().fetch();
2024-04-23 05:56:07 +00:00
2024-04-22 05:37:35 +00:00
startInterval();
}
2022-03-24 15:49:33 +00:00
function isLoggedIn() {
const localToken = localStorage.getItem(TOKEN);
const sessionToken = sessionStorage.getItem(TOKEN);
2024-04-22 05:37:35 +00:00
startInterval();
2022-03-24 15:49:33 +00:00
return !!(localToken || sessionToken);
}
2024-04-22 05:37:35 +00:00
function startInterval() {
stopRenewer();
const renewPeriod = +sessionStorage.getItem('renewPeriod');
if (!renewPeriod) return;
intervalId = setInterval(() => checkValidity(), renewPeriod * 1000);
}
2024-04-19 10:26:43 +00:00
function stopRenewer() {
2024-04-22 05:37:35 +00:00
clearInterval(intervalId);
2024-04-19 10:26:43 +00:00
}
async function renewToken() {
const _token = getToken();
const token = await axios.post('VnUsers/renewToken', {
headers: { Authorization: _token },
});
const _tokenMultimedia = getTokenMultimedia();
const tokenMultimedia = await axios.post('VnUsers/renewToken', {
headers: { Authorization: _tokenMultimedia },
});
2024-04-22 05:37:35 +00:00
setToken({ token: token.data.id, tokenMultimedia: tokenMultimedia.data.id });
2024-04-19 10:26:43 +00:00
}
async function checkValidity() {
const { getTokenConfig } = useState();
2024-04-22 05:37:35 +00:00
const tokenConfig = getTokenConfig() ?? sessionStorage.getItem('tokenConfig');
const storage = keepLogin() ? localStorage : sessionStorage;
const created = +storage.getItem('created');
const ttl = +storage.getItem('ttl');
2024-04-19 10:26:43 +00:00
if (isCheckingToken || !created) return;
isCheckingToken = true;
const renewPeriodInSeconds = Math.min(ttl, tokenConfig.value.renewPeriod) * 1000;
2024-04-22 05:37:35 +00:00
2024-04-19 10:26:43 +00:00
const maxDate = created + renewPeriodInSeconds;
2024-04-22 05:37:35 +00:00
const now = new Date().getTime();
2024-04-19 10:26:43 +00:00
2024-04-22 05:37:35 +00:00
if (isNaN(renewPeriodInSeconds) || now <= maxDate) {
return (isCheckingToken = false);
}
2024-04-19 10:26:43 +00:00
await renewToken();
isCheckingToken = false;
}
2022-03-24 15:49:33 +00:00
return {
getToken,
getTokenMultimedia,
2022-03-24 15:49:33 +00:00
setToken,
destroy,
login,
2022-03-24 15:49:33 +00:00
isLoggedIn,
2024-04-24 10:15:12 +00:00
checkValidity,
setSession,
renewToken,
2022-03-24 15:49:33 +00:00
};
}