57 lines
1.9 KiB
JavaScript
57 lines
1.9 KiB
JavaScript
export const saveAuthTokens = (data) => {
|
||
const { access_token, refresh_token, expires_in } = data;
|
||
|
||
// TODO: раскомментировать, когда поправят expires_in на бэке
|
||
// const expiresAt = Date.now() + expires_in * 1000
|
||
|
||
localStorage.setItem('access_token', access_token);
|
||
localStorage.setItem('refresh_token', refresh_token);
|
||
// localStorage.setItem('expires_at', expiresAt.toString())
|
||
};
|
||
|
||
export const getAuthToken = () => {
|
||
const access_token = localStorage.getItem('access_token');
|
||
|
||
return access_token;
|
||
};
|
||
|
||
export const isTokenExpired = () => {
|
||
try {
|
||
const token = getAuthToken();
|
||
if (!token) {
|
||
return true;
|
||
}
|
||
|
||
// TODO: с бэка сейчас приходит expired_in: null. Если поправят, то это логика будет не нужна. Пока что оставляю так
|
||
const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');
|
||
const jsonPayload = decodeURIComponent(
|
||
atob(base64)
|
||
.split('')
|
||
.map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
|
||
.join(''),
|
||
);
|
||
|
||
const payload = JSON.parse(jsonPayload);
|
||
const now = Math.floor(Date.now() / 1000);
|
||
|
||
// для проверки времени жизни токена
|
||
const expirationDate = new Date(payload.exp * 1000);
|
||
console.log('Токен истекает:', expirationDate.toLocaleString('ru-RU'));
|
||
|
||
return payload.exp < now;
|
||
} catch (err) {
|
||
console.error('Ошибка при разборе токена:', err.message);
|
||
return true;
|
||
}
|
||
};
|
||
|
||
export const clearAuthTokens = () => {
|
||
localStorage.removeItem('access_token');
|
||
localStorage.removeItem('refresh_token');
|
||
};
|
||
|
||
// TODO: отсутствует функционал обновления токена. добавить логику когда сделают на бэке. пока просто очистка LS
|
||
export const updateToken = () => {
|
||
clearAuthTokens();
|
||
};
|