import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import toast from 'react-hot-toast'; import { api } from '../api/client'; import { useAuthStore } from '../store/auth'; import type { User } from '../types'; // Токен приходит в URL-фрагменте (#token=...) после редиректа с бэкенда // (см. app/api/auth.py::oauth_callback) — фрагмент не уходит на сервер и не // попадает в логи/Referer, в отличие от query-параметра. export function OAuthCallback() { const navigate = useNavigate(); const { setAuth } = useAuthStore(); useEffect(() => { const params = new URLSearchParams(window.location.hash.slice(1)); const token = params.get('token'); if (!token) { toast.error('Не удалось войти — токен не получен'); navigate('/login'); return; } // Токен ещё не в сторе — передаём явным заголовком в обход interceptor'а api .get('/auth/me', { headers: { Authorization: `Bearer ${token}` } }) .then((response) => { const user: User = response.data; setAuth(user, token); toast.success(`Добро пожаловать, ${user.name}!`); navigate('/cabinet'); }) .catch(() => { toast.error('Не удалось войти — попробуйте ещё раз'); navigate('/login'); }); }, [navigate, setAuth]); return (
Выполняется вход…
); }