/** * 认证相关 API */ import axios from "axios" import apiClient from "./client" // 类型定义 export interface LoginRequest { email: string password: string } export interface LoginResponse { access_token: string refresh_token?: string | null token_type: string expires_in: number user_id: string email: string username: string display_name: string } export interface RegisterRequest { email: string password: string username: string display_name?: string } export interface User { id: string user_id: string email: string username: string display_name: string is_email_verified: boolean email_verified: boolean created_at?: string } export interface UserResponse { id?: string user_id?: string email: string username: string display_name: string is_email_verified?: boolean email_verified?: boolean created_at?: string } export const normalizeUser = (data: UserResponse): User => { const userId = data.id ?? data.user_id ?? "" const emailVerified = data.is_email_verified ?? data.email_verified ?? false return { id: userId, user_id: userId, email: data.email, username: data.username, display_name: data.display_name, is_email_verified: emailVerified, email_verified: emailVerified, created_at: data.created_at, } } // 登录 export const login = async (data: LoginRequest): Promise => { const response = await apiClient.post("/auth/login", data) return response.data } // 刷新 access_token(使用裸 axios 避免拦截器递归) export const refreshAccessToken = async (refreshToken: string): Promise => { const baseURL = apiClient.defaults.baseURL ?? "" const response = await axios.post(`${baseURL}/auth/refresh`, { refresh_token: refreshToken, }) return response.data } // 注册 export const register = async (data: RegisterRequest): Promise<{ message: string }> => { const response = await apiClient.post("/auth/register", data) return response.data } // 登出 export const logout = async (): Promise => { await apiClient.post("/auth/logout") } // 获取当前用户 export const getCurrentUser = async (): Promise => { const response = await apiClient.get("/auth/me") return normalizeUser(response.data) } // 请求密码重置 export const requestPasswordReset = async (email: string): Promise<{ message: string }> => { const response = await apiClient.post("/auth/forgot-password", { email }) return response.data } // 重置密码 export const resetPassword = async ( token: string, newPassword: string, ): Promise<{ message: string }> => { const response = await apiClient.post("/auth/reset-password", { token, new_password: newPassword, }) return response.data } // 验证邮箱 export const verifyEmail = async (token: string): Promise<{ message: string }> => { const response = await apiClient.post("/auth/verify-email", { token }) return response.data }