Backend: - Add ChangePasswordReq DTO with validation (current + new password) - Add AuthService::change_password() method with credential verification, password rehash, and token revocation - Add POST /api/v1/auth/change-password endpoint with utoipa annotation Frontend: - Add changePassword() API function in auth.ts - Add ChangePassword.tsx page with form validation and confirmation - Add "修改密码" tab in Settings page After password change, all refresh tokens are revoked and the user is redirected to the login page.
64 lines
1.3 KiB
TypeScript
64 lines
1.3 KiB
TypeScript
import client from './client';
|
|
|
|
export interface LoginRequest {
|
|
username: string;
|
|
password: string;
|
|
}
|
|
|
|
export interface UserInfo {
|
|
id: string;
|
|
username: string;
|
|
email?: string;
|
|
phone?: string;
|
|
display_name?: string;
|
|
avatar_url?: string;
|
|
status: string;
|
|
roles: RoleInfo[];
|
|
version: number;
|
|
}
|
|
|
|
export interface RoleInfo {
|
|
id: string;
|
|
name: string;
|
|
code: string;
|
|
description?: string;
|
|
is_system: boolean;
|
|
}
|
|
|
|
export interface LoginResponse {
|
|
access_token: string;
|
|
refresh_token: string;
|
|
expires_in: number;
|
|
user: UserInfo;
|
|
}
|
|
|
|
export async function login(req: LoginRequest): Promise<LoginResponse> {
|
|
const { data } = await client.post<{ success: boolean; data: LoginResponse }>(
|
|
'/auth/login',
|
|
req
|
|
);
|
|
return data.data;
|
|
}
|
|
|
|
export async function refresh(refreshToken: string): Promise<LoginResponse> {
|
|
const { data } = await client.post<{ success: boolean; data: LoginResponse }>(
|
|
'/auth/refresh',
|
|
{ refresh_token: refreshToken }
|
|
);
|
|
return data.data;
|
|
}
|
|
|
|
export async function logout(): Promise<void> {
|
|
await client.post('/auth/logout');
|
|
}
|
|
|
|
export async function changePassword(
|
|
currentPassword: string,
|
|
newPassword: string
|
|
): Promise<void> {
|
|
await client.post('/auth/change-password', {
|
|
current_password: currentPassword,
|
|
new_password: newPassword,
|
|
});
|
|
}
|