diff --git a/src/App.vue b/src/App.vue index 51e375b..8a495f2 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,32 +3,61 @@ import Menubar from 'primevue/menubar'; import { useRouter } from 'vue-router'; import Toast from 'primevue/toast'; - + import { useAuth } from './composables/useAuth.js'; const router = useRouter(); - const menuItems =[ - { - label: 'Accueil', - command:() => router.push({name:'home'}), - icon: 'pi pi-home', - }, - { - label:'Login', - command:() => router.push({name:'login'}), - icon:'pi pi-user', - }, - { - label:'Swagger', - command:() => router.push({name:'swagger'}), - icon:'pi pi-cog', - } - ]; + const { isAuth,userInfo,logout } = useAuth(); + + const getMenuItems = () =>{ + if(isAuth.value){ + return [ + { + label: 'Accueil', + command:() => router.push({name:'home'}), + icon: 'pi pi-home', + }, + { + label:'Logout', + command:() => logout(), + icon:'pi pi-sign-out', + }, + { + label:userInfo.value ? userInfo.value.username : 'Profil', + command:() => router.push({name:'login'}), + icon:'pi pi-user', + }, + { + label:'Swagger', + command:() => router.push({name:'swagger'}), + icon:'pi pi-cog', + }, + ]; + } else { + return [ + { + label: 'Accueil', + command:() => router.push({name:'home'}), + icon: 'pi pi-home', + }, + { + label:'Register/Login', + command:() => router.push({name:'login'}), + icon:'pi pi-user', + }, + { + label:'Swagger', + command:() => router.push({name:'swagger'}), + icon:'pi pi-cog', + }, + ]; + } + }; \ No newline at end of file diff --git a/src/api.js b/src/api.js index dceb501..38784da 100644 --- a/src/api.js +++ b/src/api.js @@ -20,6 +20,19 @@ export const createUser = async (userData) => { return response.data }; +export const loginUser = async (userData) => { + const response = await api.post('/token/', userData); + const { access, refresh } = response.data; + + Cookies.set('refresh', refresh,{ + expires: 1, + secure: true, + sameSite: 'strict', + }); + sessionStorage.setItem('access_token', access); + return response.data; +}; + export const getuserinfo = async () => { const response = await api.get('/users/me/', { headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`}, diff --git a/src/composables/useAuth.js b/src/composables/useAuth.js new file mode 100644 index 0000000..f8c2c65 --- /dev/null +++ b/src/composables/useAuth.js @@ -0,0 +1,35 @@ +import { ref, onMounted } from 'vue'; +import { getuserinfo } from '../api.js'; +import Cookies from 'js-cookie'; + +const isAuth = ref(false); +const userInfo = ref(null); + +export function useAuth() { + onMounted(async () => { + const accessToken = sessionStorage.getItem('access_token'); + if (accessToken) { + isAuth.value = true; + try { + userInfo.value = await getuserinfo(); + } catch (error) { + console.error('Erreur de récupération des informations utilisateur :', error); + isAuth.value = false; + userInfo.value = null; + } + } + }); + + const logout = () => { + sessionStorage.removeItem('access_token'); + Cookies.remove('refresh'); + isAuth.value = false; + userInfo.value = null; + }; + + return { + isAuth, + userInfo, + logout, + }; +} \ No newline at end of file diff --git a/src/views/Login.vue b/src/views/Login.vue index f6ec0a5..868a6d4 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -1,34 +1,40 @@