blob: 42308dc43db2f4063d52f861e0a5ce3531eacf35 [file] [log] [blame]
import { getRefreshToken } from '@/api/auth';
import axios from 'axios';
function parseJwt(token: string) {
console.log('Parsing JWT token:', token);
try {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(
atob(base64)
.split('')
.map(c => `%${('00' + c.charCodeAt(0).toString(16)).slice(-2)}`)
.join('')
);
return JSON.parse(jsonPayload);
} catch (error) {
console.error('Invalid JWT token:', error);
return null;
}
}
/**
* 检查token是否过期
* @returns {string} -1: token无效 0: token未过期 1: token已过期
**/
export function isTokenExpired(token: string): string {
if (token === null || token === undefined) {
return '-1'; // 如果没有token,认为token无效
}
const decoded = parseJwt(token);
if (!decoded || !decoded.exp) {
return '-1'; // 如果解析失败或没有 `exp` 字段,认为token无效
}
const currentTime = Math.floor(Date.now() / 1000); // 当前时间(秒)
const bufferTime = 60 * 10; // 过期前的缓冲时间(秒)
return decoded.exp < currentTime ?decoded.exp < currentTime - bufferTime ? '-1' : '1' :"0";
}
async function refreshToken() {
try {
const response = await axios.post(getRefreshToken, {
token: localStorage.getItem('token'),
});
const newToken = response.data.token;
localStorage.setItem('token', newToken);
return newToken;
} catch (error) {
console.error('Failed to refresh token:', error);
return null;
}
}
export async function checkAndRefreshToken() {
const token = localStorage.getItem('token');
if (token && isTokenExpired(token)=='1') {
const newToken = await refreshToken();
if (!newToken) {
localStorage.removeItem('token');
}
}
}