Last active
March 7, 2023 10:25
-
-
Save fallinov/9f89af02998de1714e72d49bca50c6f0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Exemple de boot AXIOS pour Quasar | |
import { boot } from 'quasar/wrappers' | |
import axios from 'axios' | |
// Initialisation de l'API | |
const monApi = axios.create({ | |
baseURL: 'https://mon.api.com/', | |
timeout: 30000, | |
headers: { | |
Accept: 'application/json', | |
'Content-Type': 'application/json' | |
} | |
}) | |
/** | |
* Test si l'expiration du token et plus petite que la limite fixée | |
* par rapport à l'heure actuelle. | |
* | |
* Retourne vrais si token en dessous de la limite | |
* | |
* @param dateExpiration - Date d'expiration | |
* @param limiteEnMinutes - Limite en minutes | |
* @returns {boolean} | |
*/ | |
function tokenLimite (dateExpiration, limiteEnMinutes) { | |
const dateActuelle = parseInt(Date.now() / 1000) | |
const dateLimite = dateExpiration - 60 * limiteEnMinutes | |
return (dateActuelle - dateLimite) > 0 | |
} | |
export default boot(({ app, store }) => { | |
// Interception de toutes les requêtes AXIOS | |
monApi.interceptors.request.use(function (config) { | |
// Récupère le token de l'utlisateur actuel | |
const token = store.getters['auth/token'] || null | |
// Si un token existe, alors on l'ajoute aux headers | |
if (token) { | |
config.headers.Authorization = `Bearer ${token}` | |
} | |
// Récupère l'utilisateur actuel | |
const utilisateur = store.getters['auth/utilisateur'] || null | |
// Rafraichit le token si validité inférieure à 5 jours | |
if ( | |
utilisateur && | |
config.url !== '/auth/refresh' && | |
tokenLimite(utilisateur.tokenExpiration, 9600) | |
) { | |
store.dispatch('auth/refresh') | |
} | |
return config | |
}, function (error) { | |
// Traitement des erreurs | |
return Promise.reject(error) | |
}) | |
// Interception de toutes les réponses AXIOS | |
// Déconnecte automatiquement l'utilisateur si erreur 401 | |
monApi.interceptors.response.use(function (response) { | |
return response | |
}, function (error) { | |
if ( | |
error.response.status === 401 && | |
error.response.config.url !== '/auth/logout' && | |
error.response.config.url !== '/auth/login' | |
) { | |
store.dispatch('auth/logout') | |
} | |
return Promise.reject(error) | |
}) | |
// Permet d'utiliser les raccourcis suivant dans les fichiers Vue this.$axios and this.$api | |
app.config.globalProperties.$axios = axios | |
app.config.globalProperties.$api = monApi | |
}) | |
export { monApi } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment