49 lines
1.5 KiB
JavaScript
49 lines
1.5 KiB
JavaScript
// modules/auth.js
|
|
import { apiFetch } from './api.js';
|
|
|
|
export function parseJwtExpire(token) {
|
|
try {
|
|
const payload = JSON.parse(atob(token.split('.')[1]));
|
|
return payload.exp * 1000;
|
|
} catch {
|
|
return Date.now() + 7 * 24 * 60 * 60 * 1000;
|
|
}
|
|
}
|
|
|
|
export function saveAuthState(token, username) {
|
|
const expire = parseJwtExpire(token);
|
|
localStorage.setItem('frpc_token', token);
|
|
localStorage.setItem('frpc_token_expire', String(expire));
|
|
localStorage.setItem('frpc_username', username);
|
|
return expire;
|
|
}
|
|
|
|
export function loadAuthState() {
|
|
const token = localStorage.getItem('frpc_token');
|
|
const expire = parseInt(localStorage.getItem('frpc_token_expire') || '0', 10);
|
|
const username = localStorage.getItem('frpc_username') || '';
|
|
if (token && expire > Date.now()) {
|
|
return { token, expire, username, valid: true };
|
|
}
|
|
clearAuthState();
|
|
return { token: '', expire: 0, username: '', valid: false };
|
|
}
|
|
|
|
export function clearAuthState() {
|
|
localStorage.removeItem('frpc_token');
|
|
localStorage.removeItem('frpc_token_expire');
|
|
localStorage.removeItem('frpc_username');
|
|
}
|
|
|
|
export async function login(username, password) {
|
|
const data = await apiFetch('/login', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ username, password }),
|
|
});
|
|
if (data.code === 0) {
|
|
const token = data.data.token;
|
|
const expire = saveAuthState(token, username);
|
|
return { success: true, token, expire };
|
|
}
|
|
return { success: false, error: data.msg || '登录失败' };
|
|
} |