mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-05 03:12:34 -06:00
авторизация fixed
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import axios from 'axios';
|
||||
import { notification } from 'antd';
|
||||
import type {
|
||||
CatalogItem,
|
||||
CreateInvoiceRequest,
|
||||
@@ -30,9 +31,6 @@ const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:8080/api';
|
||||
// Телеграм объект
|
||||
const tg = window.Telegram?.WebApp;
|
||||
|
||||
// ID для локальной разработки (Fallback)
|
||||
const DEBUG_USER_ID = 665599275;
|
||||
|
||||
// Событие для глобальной обработки 401
|
||||
export const UNAUTHORIZED_EVENT = 'rms_unauthorized';
|
||||
|
||||
@@ -43,31 +41,42 @@ const apiClient = axios.create({
|
||||
},
|
||||
});
|
||||
|
||||
// --- Request Interceptor (Авторизация) ---
|
||||
// --- Request Interceptor (Авторизация через initData) ---
|
||||
apiClient.interceptors.request.use((config) => {
|
||||
// 1. Пробуем взять ID из Telegram WebApp
|
||||
// 2. Ищем в URL параметрах (удобно для тестов в браузере: ?_tg_id=123)
|
||||
// 3. Используем хардкод для локальной разработки
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const paramId = urlParams.get('_tg_id');
|
||||
|
||||
const userId = tg?.initDataUnsafe?.user?.id || paramId || DEBUG_USER_ID;
|
||||
const initData = tg?.initData;
|
||||
|
||||
if (userId) {
|
||||
config.headers['X-Telegram-User-ID'] = userId.toString();
|
||||
// Если initData пустая — мы не в Telegram. Блокируем запрос.
|
||||
if (!initData) {
|
||||
console.error('Запрос заблокирован: приложение запущено вне Telegram.');
|
||||
return Promise.reject(new Error('MISSING_TELEGRAM_DATA'));
|
||||
}
|
||||
|
||||
// Устанавливаем заголовок согласно новым требованиям
|
||||
config.headers['Authorization'] = `Bearer ${initData}`;
|
||||
|
||||
return config;
|
||||
});
|
||||
|
||||
// --- Response Interceptor (Обработка ошибок) ---
|
||||
// --- Response Interceptor (Обработка ошибок и уведомления) ---
|
||||
apiClient.interceptors.response.use(
|
||||
(response) => response,
|
||||
(error) => {
|
||||
if (error.response && error.response.status === 401) {
|
||||
// Генерируем кастомное событие, которое поймает App.tsx
|
||||
// Глобальное уведомление об ошибке авторизации
|
||||
notification.error({
|
||||
message: 'Ошибка авторизации',
|
||||
description: 'Ваша сессия в Telegram истекла или данные неверны. Попробуйте перезапустить бота.',
|
||||
placement: 'top',
|
||||
});
|
||||
|
||||
window.dispatchEvent(new Event(UNAUTHORIZED_EVENT));
|
||||
}
|
||||
|
||||
// Если запрос был отменен нами (нет initData), не выводим стандартную ошибку API
|
||||
if (error.message === 'MISSING_TELEGRAM_DATA') {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
console.error('API Error:', error);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user