Gestione Refresh Token Completata !

This commit is contained in:
Surya Paolo
2024-04-11 11:43:38 +02:00
parent 62c0f497e5
commit bff31b5fd4
93 changed files with 3592683 additions and 214 deletions

View File

@@ -18,6 +18,7 @@ import * as ApiTables from '@src/store/Modules/ApiTables'
import sendRequest from './Inst-Pao'
import Request from './Instance'
import globalroutines from '../../globalroutines/index'
import { useRouter } from 'vue-router'
function ReceiveResponsefromServer(tablesync: string, nametab: string, method: string, risdata: any) {
// console.log('ReceiveResponsefromServer', nametab, method, risdata)
@@ -92,32 +93,45 @@ export const Api = {
// Altrimenti, gestisci il caso di refreshToken scaduto o invalido, e.g., redirecting to login
try {
const userStore = useUserStore()
console.log('refreshToken')
const response = await axios.post('/users/newTok', {
refreshToken: localStorage.getItem(toolsext.localStorage.refreshToken)
});
const refrTok = localStorage.getItem(toolsext.localStorage.refreshToken)
let response = null
if (refrTok && refrTok !== 'undefined') {
// console.log('refreshToken=', refrTok)
response = await sendRequest('/users/newtok', 'POST', { refreshToken: refrTok })
// Save the new access token in local storage
localStorage.setItem(toolsext.localStorage.token, response.data.accessToken);
if (response) {
// Reset the refresh token if it was reset by the server
if (response.data.refreshToken) {
localStorage.setItem(toolsext.localStorage.refreshToken, response.data.refreshToken);
// Save the new access token in local storage
localStorage.setItem(toolsext.localStorage.token, response.data.token);
// Reset the refresh token if it was reset by the server
if (response.data.refreshToken) {
console.log('salva refreshtoken', response.data.refreshToken)
userStore.setRefreshToken(response.data.refreshToken)
}
// Return the new access token
return response.data.token;
} else {
userStore.setAuth('', '')
localStorage.removeItem(toolsext.localStorage.token)
localStorage.removeItem(toolsext.localStorage.refreshToken)
}
}
// Return the new access token
return response.data.accessToken;
} catch (error) {
// Handle the error, for example by logging out the user
console.error(error);
localStorage.removeItem(toolsext.localStorage.token);
localStorage.removeItem(toolsext.localStorage.refreshToken);
throw error;
console.error(error)
localStorage.removeItem(toolsext.localStorage.token)
localStorage.removeItem(toolsext.localStorage.refreshToken)
throw error
}
},
async SendReq(url: string, method: string, mydata: any, setAuthToken = false): Promise<Types.AxiosSuccess | Types.AxiosError> {
async SendReq(url: string, method: string, mydata: any, setAuthToken = false, evitaloop = false): Promise<Types.AxiosSuccess | Types.AxiosError> {
const mydataout = {
...mydata,
keyappid: process.env.PAO_APP_ID,
@@ -129,13 +143,13 @@ export const Api = {
const userStore = useUserStore()
const globalStore = useGlobalStore()
// const $router = useRouter()
const $router = useRouter()
userStore.setServerCode(tools.EMPTY)
userStore.setResStatus(0)
// eslint-disable-next-line @typescript-eslint/no-misused-promises
return new Promise((resolve, reject) => sendRequest(url, method, mydataout)
.then(async (res) => {
.then((res) => {
// console.log('status:', res.status)
setTimeout(() => {
@@ -156,28 +170,13 @@ export const Api = {
userStore.setAuth('', '')
// $router.push('/signin')
return reject({ code: toolsext.ERR_AUTHENTICATION })
} else if (res.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_TOKEN_EXPIRED) {
console.log('Token Expired')
// Prova ad ottenere un nuovo token di accesso
try {
// Se il token è scaduto, allora faccio la richiesta di un NUOVO TOKEN, passandogli refreshToken
const newAccessToken = await this.refreshToken();
userStore.setAuth(newAccessToken, userStore.refreshToken);
// Riprova l'originale SendReq con il nuovo token.
// Assicurati di evitare un loop infinito in caso di errori continui
return resolve(this.SendReq(url, method, mydata, setAuthToken));
} catch (error) {
// Gestisci errore di refresh token (es. redirect a signin)
return reject(error);
}
}
}
if (tools.isDebug())
console.log(' ----> ', res)
return resolve(res)
})
.catch((error) => {
.catch(async (error) => {
setTimeout(() => {
if (method === 'get') {
globalStore.connData.downloading_server = -1
@@ -187,6 +186,37 @@ export const Api = {
}
}, 1000)
if (error.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_TOKEN_EXPIRED) {
console.log('Token Expired')
// Prova ad ottenere un nuovo token di accesso
try {
// Se il token è scaduto, allora faccio la richiesta di un NUOVO TOKEN, passandogli refreshToken
const newAccessToken = await this.refreshToken();
if (newAccessToken) {
userStore.setAuth(newAccessToken, userStore.refreshToken);
// Riprova l'originale SendReq con il nuovo token.
// Assicurati di evitare un loop infinito in caso di errori continui
if (!evitaloop)
return resolve(this.SendReq(url, method, mydata, setAuthToken, true));
} else {
$router.push('/signin')
}
} catch (err2: any) {
// Gestisci errore di refresh token (es. redirect a signin)
console.error('err2', err2)
if (err2 && err2.hasOwnProperty('code') && err2.code === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN) {
// Forbidden
// You probably is connectiong with other page...
userStore.setServerCode(toolsext.ERR_AUTHENTICATION)
userStore.setAuth('', '')
return reject({ code: toolsext.ERR_AUTHENTICATION })
}
// return reject(err2);
}
}
console.log('ERROR', error)
return reject(error)
}))