Значение cookie через некоторое время становится нулевымJavascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Значение cookie через некоторое время становится нулевым

Сообщение Anonymous »

Я храню токен доступа и токен обновления в отдельных файлах cookie, срок действия обоих которых истекает через 7 дней. Срок действия токена доступа истекает каждые 10 минут. Я реализовал функцию обновления токена, которая запускается за 1 минуту до истечения срока действия токена доступа, автоматически обновляя состояние токена. Токены остаются действительными при активном использовании веб-сайта, но если я некоторое время бездействую, значение токена доступа становится нулевым.
`"use client";
import { createContext, useContext, useState, useEffect } from "react";
import axios from "axios";
import Cookies from "js-cookie";
import jwt from "jsonwebtoken";
import { useRouter } from "next/navigation";

const AuthContext = createContext();

export const AuthProvider = ({
children
}) => {
const apiURL = process.env.NEXT_PUBLIC_API_URL;
const router = useRouter();

const [user, setUser] = useState(null);
const [token, setToken] = useState(null);
const [loading, setLoading] = useState(true);

useEffect(() => {
const storedToken = Cookies.get("token");
if (storedToken) {
setToken(storedToken);
} else {
logoutAction();
}
}, []);

useEffect(() => {
const storedUser = JSON.parse(localStorage.getItem("user"));

if (storedUser) {
if (storedUser.roleTypeId === 3) {
router.push("/dashboard");
}
}
}, [user]);

useEffect(() => {
const initializeAuth = async () => {
setLoading(true);
console.log(token);
try {
const storedUser = localStorage.getItem("user");
if (storedUser) setUser(JSON.parse(storedUser));

const currentToken = Cookies.get("token");
console.log(currentToken);
if (currentToken) {
const decodedToken = jwt.decode(currentToken);
if (Date.now() >= decodedToken?.exp * 1000) {
await handleTokenRefresh();
}
} else {
logoutAction();
}
} catch (error) {
console.error("Error during auth initialization:", error);
} finally {
setLoading(false);
}
};

initializeAuth();
}, [token]);

useEffect(() => {
const intervalId = setInterval(async () => {
try {
if (token) {
const decodedToken = jwt.decode(token);

if (Date.now() >= decodedToken?.exp * 1000) {
await handleTokenRefresh();
}
}
} catch (error) {
throw error;
}
}, 60000);

return () => {
clearInterval(intervalId);
};
});

const handleTokenRefresh = async () => {
try {
const currentRefreshToken = Cookies.get("refreshToken");
const currentToken = Cookies.get("token");

const { data } = await axios.post(
`${apiURL}/Authentication/RefreshToken`,
{
refreshToken: currentRefreshToken,
token: currentToken,
},
{
headers: {
"Content-Type": "application/json",
Accept: "application/json",
Authorization: `bearer ${token}`,
},
}
);

updateTokens(data.token, data.refreshToken);
return data;
} catch (error) {
console.error("Error refreshing token:", error);
logoutAction();
throw error;
}
};

const updateTokens = (
newToken
, newRefreshToken) => {
const cookieOptions = {
secure: true,
sameSite: "strict",
expires: 7,
path: "/",
domain: window.location.hostname,
};

Cookies.set("token",
newToken
, cookieOptions);
Cookies.set("refreshToken",
newRefreshToken
, cookieOptions);
setToken(
newToken
);
};

const LoginAction = async (
loginData
) => {
setLoading(true);
try {
const { data } = await axios.post(
`${apiURL}/Authentication/LoginUser`,

loginData
,
{
headers: {
"Content-Type": "application/json",
Accept: "application/json",
},
}
);

updateTokens(
data.authenticationResult.token,
data.authenticationResult.refreshToken
);

localStorage.setItem("user", JSON.stringify(data.user));
setUser(data.user);
return data;
} catch (error) {
throw error.response;
} finally {
setLoading(false);
}
};

const logoutAction = () => {
Cookies.remove("token");
Cookies.remove("refreshToken");
localStorage.removeItem("user");
setUser(null);
setToken(null);
router.push("/");
};

return (

{
children
}

);
};

export const useAuth = () => useContext(AuthContext);`


Подробнее здесь: https://stackoverflow.com/questions/793 ... er-a-while
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»