Make authentication more reliable
This commit is contained in:
parent
6217cfb170
commit
568c6f0e31
@ -37,7 +37,14 @@ export default abstract class BaseApiService {
|
|||||||
if (contentType === ContentType.JSON || contentType === ContentType.PDF) {
|
if (contentType === ContentType.JSON || contentType === ContentType.PDF) {
|
||||||
headers.set("Content-Type", contentType);
|
headers.set("Content-Type", contentType);
|
||||||
}
|
}
|
||||||
headers.set("Authorization", `Bearer ${token}`);
|
|
||||||
|
// Only set Authorization header if token exists
|
||||||
|
if (token) {
|
||||||
|
headers.set("Authorization", `Bearer ${token}`);
|
||||||
|
} else {
|
||||||
|
console.warn("No access token found in cookies when building headers");
|
||||||
|
}
|
||||||
|
|
||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,37 +142,60 @@ export default abstract class BaseApiService {
|
|||||||
|
|
||||||
private async checkJwtToken() {
|
private async checkJwtToken() {
|
||||||
const accessToken = CookieService.getInstance().getCookie("leCoffreAccessToken");
|
const accessToken = CookieService.getInstance().getCookie("leCoffreAccessToken");
|
||||||
if (!accessToken) return;
|
if (!accessToken) {
|
||||||
|
console.warn("No access token found during JWT check");
|
||||||
const userDecodedToken = jwt_decode(accessToken) as IUserJwtPayload;
|
return;
|
||||||
const customerDecodedToken = jwt_decode(accessToken) as ICustomerJwtPayload;
|
|
||||||
|
|
||||||
if (!userDecodedToken && !customerDecodedToken) return;
|
|
||||||
|
|
||||||
const now = Math.floor(Date.now() / 1000);
|
|
||||||
if (userDecodedToken.userId && userDecodedToken.exp < now) {
|
|
||||||
const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken");
|
|
||||||
if (!refreshToken) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const decodedRefreshToken = jwt_decode(refreshToken) as IUserJwtPayload | ICustomerJwtPayload;
|
|
||||||
if (decodedRefreshToken.exp < now) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await JwtService.getInstance().refreshToken(refreshToken);
|
|
||||||
}
|
}
|
||||||
if (customerDecodedToken.customerId && customerDecodedToken.exp < now) {
|
|
||||||
const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken");
|
try {
|
||||||
if (!refreshToken) {
|
const userDecodedToken = jwt_decode(accessToken) as IUserJwtPayload;
|
||||||
|
const customerDecodedToken = jwt_decode(accessToken) as ICustomerJwtPayload;
|
||||||
|
|
||||||
|
if (!userDecodedToken && !customerDecodedToken) {
|
||||||
|
console.warn("Invalid token format during JWT check");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const decodedRefreshToken = jwt_decode(refreshToken) as IUserJwtPayload | ICustomerJwtPayload;
|
|
||||||
if (decodedRefreshToken.exp < now) {
|
const now = Math.floor(Date.now() / 1000);
|
||||||
return;
|
|
||||||
|
if (userDecodedToken.userId && userDecodedToken.exp < now) {
|
||||||
|
const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken");
|
||||||
|
if (!refreshToken) {
|
||||||
|
console.warn("Access token expired but no refresh token found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const decodedRefreshToken = jwt_decode(refreshToken) as IUserJwtPayload | ICustomerJwtPayload;
|
||||||
|
if (decodedRefreshToken.exp < now) {
|
||||||
|
console.warn("Both access and refresh tokens are expired");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const refreshSuccess = await JwtService.getInstance().refreshToken(refreshToken);
|
||||||
|
if (!refreshSuccess) {
|
||||||
|
console.error("Failed to refresh token");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
await JwtService.getInstance().refreshToken(refreshToken);
|
|
||||||
|
if (customerDecodedToken.customerId && customerDecodedToken.exp < now) {
|
||||||
|
const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken");
|
||||||
|
if (!refreshToken) {
|
||||||
|
console.warn("Access token expired but no refresh token found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const decodedRefreshToken = jwt_decode(refreshToken) as IUserJwtPayload | ICustomerJwtPayload;
|
||||||
|
if (decodedRefreshToken.exp < now) {
|
||||||
|
console.warn("Both access and refresh tokens are expired");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const refreshSuccess = await JwtService.getInstance().refreshToken(refreshToken);
|
||||||
|
if (!refreshSuccess) {
|
||||||
|
console.error("Failed to refresh token");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error during JWT token check:", error);
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async processResponse<T>(response: Response, request: () => Promise<Response>, ref?: IRef, fileName?: string): Promise<T> {
|
protected async processResponse<T>(response: Response, request: () => Promise<Response>, ref?: IRef, fileName?: string): Promise<T> {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import Users from "@Front/Api/LeCoffreApi/Notary/Users/Users";
|
import Users from "@Front/Api/LeCoffreApi/Notary/Users/Users";
|
||||||
import JwtService from "@Front/Services/JwtService/JwtService";
|
import JwtService from "@Front/Services/JwtService/JwtService";
|
||||||
|
import UserStore from "@Front/Stores/UserStore";
|
||||||
import User from "le-coffre-resources/dist/Notary";
|
import User from "le-coffre-resources/dist/Notary";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
@ -7,8 +8,18 @@ export default function useUser() {
|
|||||||
const [user, setUser] = useState<User | null>();
|
const [user, setUser] = useState<User | null>();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
// Check if user is connected before making API calls
|
||||||
|
if (!UserStore.instance.isConnected()) {
|
||||||
|
console.warn("User not connected, skipping API call");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const decodedJwt = JwtService.getInstance().decodeJwt();
|
const decodedJwt = JwtService.getInstance().decodeJwt();
|
||||||
if (!decodedJwt) return;
|
if (!decodedJwt) {
|
||||||
|
console.warn("No valid JWT found, skipping API call");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Users.getInstance()
|
Users.getInstance()
|
||||||
.getByUid(decodedJwt.userId, {
|
.getByUid(decodedJwt.userId, {
|
||||||
q: {
|
q: {
|
||||||
@ -17,6 +28,9 @@ export default function useUser() {
|
|||||||
})
|
})
|
||||||
.then((user) => {
|
.then((user) => {
|
||||||
setUser(user);
|
setUser(user);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error("Failed to fetch user:", error);
|
||||||
});
|
});
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
@ -10,10 +10,27 @@ export default class UserStore {
|
|||||||
public accessToken: string | null = null;
|
public accessToken: string | null = null;
|
||||||
public refreshToken: string | null = null;
|
public refreshToken: string | null = null;
|
||||||
|
|
||||||
private constructor() {}
|
private constructor() {
|
||||||
|
// Initialize tokens from cookies on store creation
|
||||||
|
this.initializeFromCookies();
|
||||||
|
}
|
||||||
|
|
||||||
|
private initializeFromCookies() {
|
||||||
|
const accessToken = CookieService.getInstance().getCookie("leCoffreAccessToken");
|
||||||
|
const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken");
|
||||||
|
|
||||||
|
if (accessToken) {
|
||||||
|
this.accessToken = accessToken;
|
||||||
|
}
|
||||||
|
if (refreshToken) {
|
||||||
|
this.refreshToken = refreshToken;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public isConnected(): boolean {
|
public isConnected(): boolean {
|
||||||
return !!this.accessToken;
|
// Check both instance variable and cookie to ensure consistency
|
||||||
|
const cookieToken = CookieService.getInstance().getCookie("leCoffreAccessToken");
|
||||||
|
return !!(this.accessToken || cookieToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public getRole(): string | undefined {
|
public getRole(): string | undefined {
|
||||||
@ -27,6 +44,10 @@ export default class UserStore {
|
|||||||
CookieService.getInstance().setCookie("leCoffreAccessToken", accessToken);
|
CookieService.getInstance().setCookie("leCoffreAccessToken", accessToken);
|
||||||
CookieService.getInstance().setCookie("leCoffreRefreshToken", refreshToken);
|
CookieService.getInstance().setCookie("leCoffreRefreshToken", refreshToken);
|
||||||
|
|
||||||
|
// Update instance variables
|
||||||
|
this.accessToken = accessToken;
|
||||||
|
this.refreshToken = refreshToken;
|
||||||
|
|
||||||
this.event.emit("connection", this.accessToken);
|
this.event.emit("connection", this.accessToken);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
@ -41,6 +62,10 @@ export default class UserStore {
|
|||||||
CookieService.getInstance().deleteCookie("leCoffreAccessToken");
|
CookieService.getInstance().deleteCookie("leCoffreAccessToken");
|
||||||
CookieService.getInstance().deleteCookie("leCoffreRefreshToken");
|
CookieService.getInstance().deleteCookie("leCoffreRefreshToken");
|
||||||
|
|
||||||
|
// Clear instance variables
|
||||||
|
this.accessToken = null;
|
||||||
|
this.refreshToken = null;
|
||||||
|
|
||||||
this.event.emit("disconnection", this.accessToken);
|
this.event.emit("disconnection", this.accessToken);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
@ -10,10 +10,27 @@ export default class UserStore {
|
|||||||
public accessToken: string | null = null;
|
public accessToken: string | null = null;
|
||||||
public refreshToken: string | null = null;
|
public refreshToken: string | null = null;
|
||||||
|
|
||||||
private constructor() {}
|
private constructor() {
|
||||||
|
// Initialize tokens from cookies on store creation
|
||||||
|
this.initializeFromCookies();
|
||||||
|
}
|
||||||
|
|
||||||
|
private initializeFromCookies() {
|
||||||
|
const accessToken = CookieService.getInstance().getCookie("leCoffreAccessToken");
|
||||||
|
const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken");
|
||||||
|
|
||||||
|
if (accessToken) {
|
||||||
|
this.accessToken = accessToken;
|
||||||
|
}
|
||||||
|
if (refreshToken) {
|
||||||
|
this.refreshToken = refreshToken;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public isConnected(): boolean {
|
public isConnected(): boolean {
|
||||||
return !!this.accessToken;
|
// Check both instance variable and cookie to ensure consistency
|
||||||
|
const cookieToken = CookieService.getInstance().getCookie("leCoffreAccessToken");
|
||||||
|
return !!(this.accessToken || cookieToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public getRole(): string | undefined {
|
public getRole(): string | undefined {
|
||||||
@ -27,6 +44,10 @@ export default class UserStore {
|
|||||||
CookieService.getInstance().setCookie("leCoffreAccessToken", accessToken);
|
CookieService.getInstance().setCookie("leCoffreAccessToken", accessToken);
|
||||||
CookieService.getInstance().setCookie("leCoffreRefreshToken", refreshToken);
|
CookieService.getInstance().setCookie("leCoffreRefreshToken", refreshToken);
|
||||||
|
|
||||||
|
// Update instance variables
|
||||||
|
this.accessToken = accessToken;
|
||||||
|
this.refreshToken = refreshToken;
|
||||||
|
|
||||||
this.event.emit("connection", this.accessToken);
|
this.event.emit("connection", this.accessToken);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
@ -41,6 +62,10 @@ export default class UserStore {
|
|||||||
CookieService.getInstance().deleteCookie("leCoffreAccessToken");
|
CookieService.getInstance().deleteCookie("leCoffreAccessToken");
|
||||||
CookieService.getInstance().deleteCookie("leCoffreRefreshToken");
|
CookieService.getInstance().deleteCookie("leCoffreRefreshToken");
|
||||||
|
|
||||||
|
// Clear instance variables
|
||||||
|
this.accessToken = null;
|
||||||
|
this.refreshToken = null;
|
||||||
|
|
||||||
this.event.emit("disconnection", this.accessToken);
|
this.event.emit("disconnection", this.accessToken);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user