'use client'; import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; export default function LoginPage() { const router = useRouter(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); // Проверяем авторизацию при загрузке useEffect(() => { async function checkAuth() { try { const response = await fetch('/api/auth/me', { credentials: 'same-origin' }); if (response.ok) { router.push('/dashboard'); } } catch (err) { // Не авторизован, остаёмся на странице входа } } checkAuth(); }, [router]); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setLoading(true); setError(''); try { const response = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin', body: JSON.stringify({ email, password }), }); const data = await response.json(); if (!response.ok) { throw new Error(data.message || 'Ошибка входа'); } // CSRF токен теперь в cookie с SameSite защитой // Next.js автоматически отправит его с последующими запросами router.push('/dashboard'); } catch (err: unknown) { setError(err instanceof Error ? err.message : 'Неизвестная ошибка'); setLoading(false); } } return (
Войдите для продолжения
{error &&