jwt token in cookie, no more duplicate requests
This commit is contained in:
parent
3e6d15ab13
commit
8bd4c8d2c3
@ -13,6 +13,7 @@
|
|||||||
const { isAuth,userInfo,logout } = useAuth();
|
const { isAuth,userInfo,logout } = useAuth();
|
||||||
|
|
||||||
const getMenuItems = () =>{
|
const getMenuItems = () =>{
|
||||||
|
console.log(isAuth.value)
|
||||||
if(isAuth.value){
|
if(isAuth.value){
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
@ -52,11 +53,6 @@
|
|||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
return [
|
return [
|
||||||
{
|
|
||||||
label: 'Accueil',
|
|
||||||
command:() => router.push({name:'home'}),
|
|
||||||
icon: 'pi pi-home',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label:'Register/Login',
|
label:'Register/Login',
|
||||||
command:() => router.push({name:'login'}),
|
command:() => router.push({name:'login'}),
|
||||||
|
82
src/api.js
82
src/api.js
@ -9,99 +9,115 @@ const api = axios.create({
|
|||||||
|
|
||||||
export const createUser = async (userData) => {
|
export const createUser = async (userData) => {
|
||||||
const response = await api.post('/users', userData);
|
const response = await api.post('/users', userData);
|
||||||
const { access, refresh } = response.data;
|
const accessToken = response.data.access;
|
||||||
|
|
||||||
Cookies.set('refresh', refresh,{
|
Cookies.set('access_token', accessToken,{
|
||||||
expires: 1,
|
expires: 1,
|
||||||
secure: true,
|
secure: true,
|
||||||
sameSite: 'strict',
|
sameSite: 'strict',
|
||||||
});
|
});
|
||||||
sessionStorage.setItem('access_token', access);
|
|
||||||
return response.data
|
return response.data
|
||||||
};
|
};
|
||||||
|
|
||||||
export const loginUser = async (userData) => {
|
export const loginUser = async (userData) => {
|
||||||
const response = await api.post('/token/', userData);
|
const response = await api.post('/token/', userData);
|
||||||
const { access, refresh } = response.data;
|
const accessToken = response.data.access;
|
||||||
|
Cookies.set('access_token', accessToken,{
|
||||||
Cookies.set('refresh', refresh,{
|
|
||||||
expires: 1,
|
expires: 1,
|
||||||
secure: true,
|
secure: true,
|
||||||
sameSite: 'strict',
|
sameSite: 'strict',
|
||||||
});
|
});
|
||||||
sessionStorage.setItem('access_token', access);
|
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const updateUser = async (userData) => {
|
export const updateUser = async (userData) => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.put('/users/me/', userData, {
|
const response = await api.put('/users/me/', userData, {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
}
|
}
|
||||||
export const getuserinfo = async () => {
|
export const getuserinfo = async () => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.get('/users/me/', {
|
const response = await api.get('/users/me/', {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createProduct = async (productData) => {
|
export const createProduct = async (productData) => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.post('/products/', productData, {
|
const response = await api.post('/products/', productData, {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getProducts = async () => {
|
export const getProducts = async () => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.get('/products/', {
|
const response = await api.get('/products/', {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const modifyProduct = async (productData, id) => {
|
export const modifyProduct = async (productData, id) => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.patch(`/products/${id}/`, productData, {
|
const response = await api.patch(`/products/${id}/`, productData, {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const deleteProduct = async (id) => {
|
export const deleteProduct = async (id) => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.delete(`/products/${id}/`, {
|
const response = await api.delete(`/products/${id}/`, {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getWarehouses = async () => {
|
export const getWarehouses = async () => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.get('/warehouses/', {
|
const response = await api.get('/warehouses/', {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createWarehouse = async (warehouseData) => {
|
export const createWarehouse = async (warehouseData) => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.post('/warehouses/', warehouseData, {
|
const response = await api.post('/warehouses/', warehouseData, {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const modifyWarehouse = async (warehouseData, id) => {
|
export const modifyWarehouse = async (warehouseData, id) => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.patch(`/warehouses/${id}/`, warehouseData, {
|
const response = await api.patch(`/warehouses/${id}/`, warehouseData, {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const deleteWarehouse = async (id) => {
|
export const deleteWarehouse = async (id) => {
|
||||||
|
const cookie = verifyCookie();
|
||||||
const response = await api.delete(`/warehouses/${id}/`, {
|
const response = await api.delete(`/warehouses/${id}/`, {
|
||||||
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
|
headers: {Authorization: `Bearer ${cookie}`},
|
||||||
});
|
});
|
||||||
return response.data;
|
return response.data;
|
||||||
};
|
};
|
||||||
const refreshAccessToken = async () => {
|
|
||||||
|
export function verifyCookie() {
|
||||||
|
const accessToken = Cookies.get("access_token");
|
||||||
|
if (accessToken) {
|
||||||
|
return accessToken
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* const refreshAccessToken = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await api.post('/token/refresh', {'refresh': Cookies.get('refresh')}, {
|
const response = await api.post('/token/refresh', {'refresh': Cookies.get('refresh')}, {
|
||||||
withCredentials: true,
|
withCredentials: true,
|
||||||
@ -116,27 +132,15 @@ const refreshAccessToken = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
api.interceptors.response.use(
|
api.interceptors.response.use(
|
||||||
(response) => response,
|
(response) => {
|
||||||
async (error) => {
|
const cookie = Cookies.get('refresh');
|
||||||
if (error.response && error.response.status === 401) {
|
console.log(cookie);
|
||||||
const errorMessage = error.response.data.detail;
|
return response;
|
||||||
if (errorMessage === "No active account found with the given credentials") {
|
},
|
||||||
return Promise.reject(error);
|
(error) => {
|
||||||
} else {
|
|
||||||
const tokens = await refreshAccessToken();
|
|
||||||
if (tokens) {
|
|
||||||
const [newAccessToken, newRefreshToken] = tokens;
|
|
||||||
Cookies.set('refresh', newRefreshToken, {
|
|
||||||
expires: 1,
|
|
||||||
secure: true,
|
|
||||||
sameSite: 'strict',
|
|
||||||
});
|
|
||||||
error.config.headers['Authorization'] = `Bearer ${newAccessToken}`;
|
|
||||||
return api(error.config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
*/
|
@ -1,18 +1,23 @@
|
|||||||
import { ref, onMounted } from 'vue';
|
import { ref, onMounted } from 'vue';
|
||||||
import { getuserinfo } from '../api.js';
|
import { getuserinfo, verifyCookie } from '../api.js';
|
||||||
import Cookies from 'js-cookie';
|
import Cookies from 'js-cookie';
|
||||||
const isAuth = ref(false);
|
const isAuth = ref(false);
|
||||||
const userInfo = ref(null);
|
const userInfo = ref(null);
|
||||||
|
|
||||||
export function useAuth() {
|
export function useAuth() {
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
const accessToken = sessionStorage.getItem('access_token');
|
const accessToken = verifyCookie();
|
||||||
if (accessToken) {
|
if (accessToken) {
|
||||||
isAuth.value = true;
|
isAuth.value = true;
|
||||||
try {
|
try {
|
||||||
userInfo.value = await getuserinfo();
|
userInfo.value = await getuserinfo();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Erreur de récupération des informations utilisateur :', error);
|
if (error.response.status = 401){
|
||||||
|
console.error('Expired access token logging out');
|
||||||
|
} else {
|
||||||
|
console.error('erreur inconnue déconnexion')
|
||||||
|
}
|
||||||
|
Cookies.remove('access_token');
|
||||||
isAuth.value = false;
|
isAuth.value = false;
|
||||||
userInfo.value = null;
|
userInfo.value = null;
|
||||||
}
|
}
|
||||||
@ -20,8 +25,7 @@ export function useAuth() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const logout = () => {
|
const logout = () => {
|
||||||
sessionStorage.removeItem('access_token');
|
Cookies.remove('access_token');
|
||||||
Cookies.remove('refresh');
|
|
||||||
isAuth.value = false;
|
isAuth.value = false;
|
||||||
userInfo.value = null;
|
userInfo.value = null;
|
||||||
};
|
};
|
||||||
|
@ -4,6 +4,7 @@ import SwaggerView from '../views/Swagger.vue';
|
|||||||
import LoginView from '../views/Login.vue';
|
import LoginView from '../views/Login.vue';
|
||||||
import DashboardView from '../views/Dashboard.vue';
|
import DashboardView from '../views/Dashboard.vue';
|
||||||
import WarehousesView from '../views/Warehouses.vue';
|
import WarehousesView from '../views/Warehouses.vue';
|
||||||
|
import { verifyCookie } from '../api.js';
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
@ -47,7 +48,7 @@ const router = createRouter({
|
|||||||
});
|
});
|
||||||
|
|
||||||
router.beforeEach(async (to,from,next) => {
|
router.beforeEach(async (to,from,next) => {
|
||||||
const isAuthenticate = sessionStorage.getItem('access_token');
|
const isAuthenticate = verifyCookie();
|
||||||
if (to.meta.requireAuth && !isAuthenticate || isAuthenticate === 'undefined' || isAuthenticate === 'null') {
|
if (to.meta.requireAuth && !isAuthenticate || isAuthenticate === 'undefined' || isAuthenticate === 'null') {
|
||||||
next({name: 'login'});
|
next({name: 'login'});
|
||||||
} else next();
|
} else next();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user