帖子分类
Change-Id: I17bafbfe3c1c8fd26c1e12499cb3c17cd1738e23
diff --git a/src/utils/jwt.ts b/src/utils/jwt.ts
new file mode 100644
index 0000000..42308dc
--- /dev/null
+++ b/src/utils/jwt.ts
@@ -0,0 +1,61 @@
+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');
+ }
+ }
+}
\ No newline at end of file