41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
// server/api/auth/logout.get.ts - 登出接口:尽量通知 NewAPI 销毁 session,并清理本地登录态。
|
|
import type { IUserLogoutData } from "#shared/types";
|
|
import {
|
|
clearNewApiAuthCookies,
|
|
createApiLogger,
|
|
createSuccessResponse,
|
|
newApiAuthedFetch,
|
|
toSafeLogError
|
|
} from "~~/server/utils";
|
|
|
|
/**
|
|
* GET /api/auth/logout
|
|
*
|
|
* 流程:
|
|
* 1. 使用本站 httpOnly cookie 中的 NewAPI session 调用上游登出。
|
|
* 2. 无论上游登出是否成功,都清理本站保存的 session/userId cookie。
|
|
* 3. 返回统一成功响应,避免坏 session 残留影响后续登录。
|
|
*/
|
|
export default defineEventHandler(async (event) => {
|
|
const logger = createApiLogger("auth.logout");
|
|
logger.info("开始");
|
|
|
|
try {
|
|
// 带上本站 httpOnly cookie 中的 NewAPI 登录态,请求上游销毁 session。
|
|
await newApiAuthedFetch<IUserLogoutData>(event, "/api/user/logout", {
|
|
method: "GET"
|
|
});
|
|
logger.info("上游登出成功");
|
|
} catch (error) {
|
|
// 上游 session 可能已失效,本地仍然必须清理,避免残留坏登录态。
|
|
logger.warn("上游登出失败,继续清理本地登录态", {
|
|
error: toSafeLogError(error)
|
|
});
|
|
} finally {
|
|
clearNewApiAuthCookies(event);
|
|
}
|
|
|
|
logger.done("成功");
|
|
return createSuccessResponse<IUserLogoutData>(null, "登出成功");
|
|
});
|