feat(web): implement user store
This commit is contained in:
@@ -1,8 +1,10 @@
|
|||||||
|
import { AuthServiceFactoryKey } from '@/services/authService';
|
||||||
|
import { ClientConfig, ClientFactoryKey } from '@/services/client';
|
||||||
import { jwtDecode } from 'jwt-decode';
|
import { jwtDecode } from 'jwt-decode';
|
||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
import { ref } from 'vue';
|
import { inject, ref } from 'vue';
|
||||||
|
|
||||||
export const USER_KEY = 'onxGraphAuth';
|
export const USER_KEY = 'fiscalos_auth';
|
||||||
|
|
||||||
export type User = {
|
export type User = {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -24,6 +26,8 @@ export type UserStore = ReturnType<typeof useUserStore>;
|
|||||||
|
|
||||||
export const useUserStore = defineStore('userStore', () => {
|
export const useUserStore = defineStore('userStore', () => {
|
||||||
const user = ref<User | null>(getUserFromLocalStorage());
|
const user = ref<User | null>(getUserFromLocalStorage());
|
||||||
|
const clientFactory = inject(ClientFactoryKey);
|
||||||
|
const authServiceFactory = inject(AuthServiceFactoryKey);
|
||||||
|
|
||||||
function logUserIn(jwtToken: string) {
|
function logUserIn(jwtToken: string) {
|
||||||
const { sub, exp } = jwtDecode<JwtTokenPayload>(jwtToken);
|
const { sub, exp } = jwtDecode<JwtTokenPayload>(jwtToken);
|
||||||
@@ -41,9 +45,39 @@ export const useUserStore = defineStore('userStore', () => {
|
|||||||
user.value = null;
|
user.value = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function refreshAccessToken(originalRequest: Request) {
|
||||||
|
const unauthorizedResponse = new Response(null, { status: 401 });
|
||||||
|
|
||||||
|
if (user.value === null || !clientFactory || !authServiceFactory) {
|
||||||
|
logUserOut();
|
||||||
|
return { response: unauthorizedResponse, accessToken: '' };
|
||||||
|
}
|
||||||
|
|
||||||
|
const client = clientFactory.create(
|
||||||
|
new ClientConfig({ Authorization: `Bearer ${user.value.token}` }, true)
|
||||||
|
);
|
||||||
|
|
||||||
|
const authService = authServiceFactory.create(client);
|
||||||
|
|
||||||
|
const refreshResult = await authService.refreshToken();
|
||||||
|
|
||||||
|
if (refreshResult.err) {
|
||||||
|
logUserOut();
|
||||||
|
return { response: unauthorizedResponse, accessToken: '' };
|
||||||
|
}
|
||||||
|
|
||||||
|
logUserIn(refreshResult.val.accessToken);
|
||||||
|
|
||||||
|
originalRequest.headers.set('Authorization', `Bearer ${refreshResult.val.accessToken}`);
|
||||||
|
const response = await fetch(originalRequest);
|
||||||
|
|
||||||
|
return { response, accessToken: refreshResult.val.accessToken };
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
user: user,
|
user: user,
|
||||||
logUserIn,
|
logUserIn,
|
||||||
logUserOut,
|
logUserOut,
|
||||||
|
refreshAccessToken,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user