dressed_for_succes_store/frontend/lib/auth.ts

148 lines
4.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;