148 lines
4.8 KiB
TypeScript
148 lines
4.8 KiB
TypeScript
import api from './api';
|
||
import { User } from './users';
|
||
|
||
// Типы данных для аутентификации
|
||
export interface LoginCredentials {
|
||
username: string;
|
||
password: string;
|
||
}
|
||
|
||
export interface TokenResponse {
|
||
access_token: string;
|
||
token_type: string;
|
||
}
|
||
|
||
export interface RegisterData {
|
||
email: string;
|
||
password: string;
|
||
password_confirm: string;
|
||
first_name?: string;
|
||
last_name?: string;
|
||
phone?: string;
|
||
is_active?: boolean;
|
||
is_admin?: boolean;
|
||
}
|
||
|
||
export interface PasswordReset {
|
||
email: string;
|
||
}
|
||
|
||
export interface PasswordChange {
|
||
current_password: string;
|
||
new_password: string;
|
||
}
|
||
|
||
// Константа для ключа токена в localStorage
|
||
const TOKEN_KEY = 'token';
|
||
|
||
// Сервис для аутентификации
|
||
const authService = {
|
||
// Вход в систему
|
||
login: async (credentials: LoginCredentials): Promise<TokenResponse> => {
|
||
// Создаем FormData для отправки данных в формате x-www-form-urlencoded
|
||
const formData = new URLSearchParams();
|
||
formData.append('username', credentials.username);
|
||
formData.append('password', credentials.password);
|
||
|
||
const response = await api.post<TokenResponse>('/auth/login', formData.toString(), {
|
||
headers: {
|
||
'Content-Type': 'application/x-www-form-urlencoded',
|
||
},
|
||
});
|
||
|
||
// Сохраняем токен в localStorage
|
||
if (response.access_token) {
|
||
try {
|
||
localStorage.setItem(TOKEN_KEY, String(response.access_token));
|
||
console.log('Токен сохранен в localStorage (auth.ts):', String(response.access_token).substring(0, 20) + '...');
|
||
|
||
// Проверяем, что токен действительно сохранился
|
||
const savedToken = localStorage.getItem(TOKEN_KEY);
|
||
console.log('Проверка сохранения токена (auth.ts):', savedToken ? 'токен сохранен' : 'токен НЕ сохранен');
|
||
|
||
// Удаляем устаревший ключ auth_token, если он есть
|
||
if (localStorage.getItem('auth_token')) {
|
||
localStorage.removeItem('auth_token');
|
||
}
|
||
} catch (storageError) {
|
||
console.error('Ошибка при сохранении токена в localStorage (auth.ts):', storageError);
|
||
}
|
||
}
|
||
|
||
return response;
|
||
},
|
||
|
||
// Регистрация нового пользователя
|
||
register: async (data: RegisterData): Promise<any> => {
|
||
const response = await api.post('/auth/register', data);
|
||
return response;
|
||
},
|
||
|
||
// Выход из системы
|
||
logout: (): void => {
|
||
try {
|
||
localStorage.removeItem(TOKEN_KEY);
|
||
// Удаляем устаревший ключ, если он есть
|
||
if (localStorage.getItem('auth_token')) {
|
||
localStorage.removeItem('auth_token');
|
||
}
|
||
console.log('Токен удален из localStorage (auth.ts)');
|
||
} catch (error) {
|
||
console.error('Ошибка при удалении токена (auth.ts):', error);
|
||
}
|
||
},
|
||
|
||
// Проверка, авторизован ли пользователь
|
||
isAuthenticated: (): boolean => {
|
||
try {
|
||
const token = localStorage.getItem(TOKEN_KEY);
|
||
return !!token;
|
||
} catch (error) {
|
||
console.error('Ошибка при проверке токена (auth.ts):', error);
|
||
return false;
|
||
}
|
||
},
|
||
|
||
// Получить текущий токен
|
||
getToken: (): string | null => {
|
||
try {
|
||
return localStorage.getItem(TOKEN_KEY);
|
||
} catch (error) {
|
||
console.error('Ошибка при получении токена (auth.ts):', error);
|
||
return null;
|
||
}
|
||
},
|
||
|
||
// Запрос на сброс пароля
|
||
resetPassword: async (email: string): Promise<any> => {
|
||
return await api.post('/auth/reset-password', { email });
|
||
},
|
||
|
||
// Установка нового пароля после сброса
|
||
setNewPassword: async (token: string, password: string): Promise<any> => {
|
||
return await api.post('/auth/set-new-password', {}, {
|
||
params: { token, password }
|
||
});
|
||
},
|
||
|
||
// Изменение пароля авторизованным пользователем
|
||
changePassword: async (currentPassword: string, newPassword: string): Promise<any> => {
|
||
return await api.post('/auth/change-password', {
|
||
current_password: currentPassword,
|
||
new_password: newPassword
|
||
});
|
||
},
|
||
|
||
// Получение профиля текущего пользователя
|
||
getProfile: async (): Promise<User | null> => {
|
||
try {
|
||
const response = await api.get<User>('/users/me');
|
||
return response;
|
||
} catch (error) {
|
||
console.error('Ошибка при получении профиля:', error);
|
||
return null;
|
||
}
|
||
}
|
||
};
|
||
|
||
export default authService;
|