feat:实现Token过期检查和自动清除机制

主要改动:
   - 在插件激活时检查Token是否过期,过期则自动清除session
   - 修复Token检查逻辑,从session.accessToken获取Token而非globalState
   - 在消息发送前检查Token有效性,过期则提示重新登录
   - 优化ICHelperPanel和ICViewProvider的Token过期处理
   - 修复退出登录命令名错误(iccoder.logout -> ic-coder.logout)
   - 添加Token过期检查文档文档
This commit is contained in:
Roe-xin
2026-01-26 18:41:52 +08:00
parent 423c9ddb0e
commit 9296b10150
7 changed files with 472 additions and 19 deletions

View File

@ -19,6 +19,7 @@ import { VCDViewerPanel } from "./VCDViewerPanel";
import { ChatHistoryManager } from "../utils/chatHistoryManager";
import { MessageType } from "../types/chatHistory";
import { getCachedUserInfo } from "../services/userService";
import { isTokenExpired } from "../utils/jwtUtils";
/**
* 获取会员等级图标 URI
@ -58,6 +59,30 @@ export async function showICHelperPanel(
context: vscode.ExtensionContext,
viewColumn?: vscode.ViewColumn
) {
// 检查 token 是否过期
let token: string | undefined;
try {
const session = await vscode.authentication.getSession("iccoder", [], { createIfNone: false });
token = session?.accessToken;
} catch (error) {
console.warn('[ICHelperPanel] 获取 session 失败:', error);
}
if (token && isTokenExpired(token)) {
// 清除过期的 session
await context.globalState.update('icCoderSessions', []);
await context.globalState.update('icCoderUserInfo', undefined);
const action = await vscode.window.showWarningMessage(
'登录已过期,请重新登录',
'立即登录'
);
if (action === '立即登录') {
vscode.commands.executeCommand("ic-coder.login");
}
return;
}
// 检查用户是否已登录
try {
const session = await vscode.authentication.getSession("iccoder", [], {
@ -104,6 +129,7 @@ export async function showICHelperPanel(
.toString(36)
.substr(2, 9)}`;
(panel as any).__uniqueId = panelId;
(panel as any).__context = context;
// 设置标签页图标
panel.iconPath = vscode.Uri.joinPath(
@ -190,6 +216,25 @@ export async function showICHelperPanel(
console.error('[ICHelperPanel] 获取用户信息失败:', error);
}
// 检查是否有待发送的消息
const pendingMessage = context.globalState.get('pendingMessage') as any;
if (pendingMessage) {
console.log('[ICHelperPanel] 检测到待发送消息,准备自动发送');
// 清除待发送消息
await context.globalState.update('pendingMessage', undefined);
// 延迟发送,确保面板已完全初始化
setTimeout(() => {
panel.webview.postMessage({
command: 'autoSendMessage',
text: pendingMessage.text,
mode: pendingMessage.mode,
serviceTier: pendingMessage.serviceTier
});
}, 500);
}
// 处理消息
panel.webview.onDidReceiveMessage(
async (message) => {
@ -524,7 +569,7 @@ export async function showICHelperPanel(
break;
case "logout":
// 退出登录(前端已有确认对话框)
vscode.commands.executeCommand('iccoder.logout');
vscode.commands.executeCommand('ic-coder.logout');
break;
}
},