Вход через Яндекс (OAuth) + сессии + бэкенд пейволла (выключен флагом)
- OAuth Yandex ID: /api/auth/yandex/{start,callback}, cookie-сессии, /api/me, logout
- Меню входа Telegram/Яндекс в шапке, определение сессии
- Бэкенд пейволла (WEB_ACCOUNTS/подписка, purpose file/sub) — под флагом
PAYWALL_ENABLED (по умолчанию 0: прежний порог авторизации, ничего не ломается)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -847,15 +847,25 @@
|
||||
<div class="logo-subtitle" data-i18n="logo_subtitle">Создание растровых pdf с эффектом сканирования из электронных pdf документов</div>
|
||||
</div>
|
||||
|
||||
<div id="header-auth">
|
||||
<button id="tg-login-header-btn" onclick="startTgAuth()" style="display:none;">
|
||||
<div id="header-auth" style="position:relative;">
|
||||
<button id="tg-login-header-btn" onclick="toggleLoginMenu(event)" style="display:none;">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="white"><path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm5.894 8.221l-1.97 9.28c-.145.658-.537.818-1.084.508l-3-2.21-1.447 1.394c-.16.16-.295.295-.605.295l.213-3.053 5.56-5.023c.242-.213-.054-.333-.373-.12L8.32 13.617l-2.96-.924c-.643-.204-.657-.643.136-.953l11.57-4.461c.537-.194 1.006.131.828.942z"/></svg>
|
||||
<span data-i18n="login_btn">Войти</span>
|
||||
</button>
|
||||
<div id="login-menu" style="display:none;position:absolute;right:0;top:calc(100% + 6px);background:#fff;border:1px solid var(--border,#d0d7e2);border-radius:10px;box-shadow:0 6px 20px rgba(0,0,0,.12);padding:6px;z-index:50;min-width:190px;">
|
||||
<button onclick="startTgAuth();closeLoginMenu();" style="display:flex;align-items:center;gap:8px;width:100%;padding:9px 12px;background:none;border:none;border-radius:8px;cursor:pointer;font-family:inherit;font-size:14px;color:#1c2b45;text-align:left;">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="#2AABEE"><path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm5.894 8.221l-1.97 9.28c-.145.658-.537.818-1.084.508l-3-2.21-1.447 1.394c-.16.16-.295.295-.605.295l.213-3.053 5.56-5.023c.242-.213-.054-.333-.373-.12L8.32 13.617l-2.96-.924c-.643-.204-.657-.643.136-.953l11.57-4.461c.537-.194 1.006.131.828.942z"/></svg>
|
||||
<span data-i18n="login_via_tg">Через Telegram</span>
|
||||
</button>
|
||||
<button onclick="location.href='/api/auth/yandex/start';" style="display:flex;align-items:center;gap:8px;width:100%;padding:9px 12px;background:none;border:none;border-radius:8px;cursor:pointer;font-family:inherit;font-size:14px;color:#1c2b45;text-align:left;">
|
||||
<span style="display:inline-flex;width:18px;height:18px;background:#FC3F1D;color:#fff;border-radius:4px;align-items:center;justify-content:center;font-weight:700;font-size:12px;">Я</span>
|
||||
<span data-i18n="login_via_yandex">Через Яндекс</span>
|
||||
</button>
|
||||
</div>
|
||||
<div id="tg-user-info" style="display:none;">
|
||||
<img id="tg-user-photo" src="" alt="" onerror="this.style.display='none'">
|
||||
<span id="tg-user-name"></span>
|
||||
<button id="tg-logout-btn" onclick="logoutTg()" data-i18n="logout_btn">Выйти</button>
|
||||
<button id="tg-logout-btn" onclick="doLogout()" data-i18n="logout_btn">Выйти</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
@@ -1132,6 +1142,9 @@
|
||||
page_title: 'pdf2scan — онлайн сканирование PDF',
|
||||
logo_subtitle: 'Создание растровых pdf с эффектом сканирования из электронных pdf документов',
|
||||
login_btn: 'Войти',
|
||||
login_via_tg: 'Через Telegram',
|
||||
login_via_yandex: 'Через Яндекс',
|
||||
err_login: 'Не удалось войти. Попробуйте снова.',
|
||||
logout_btn: 'Выйти',
|
||||
page_description: '🧷 Выберите тип сшивки и при необходимости дополнительные настройки, затем загрузите файл — получите готовый скан.',
|
||||
card_file: 'Файл',
|
||||
@@ -1235,6 +1248,9 @@
|
||||
page_title: 'pdf2scan — online PDF scan',
|
||||
logo_subtitle: 'Convert PDF to scanned document online',
|
||||
login_btn: 'Login',
|
||||
login_via_tg: 'Via Telegram',
|
||||
login_via_yandex: 'Via Yandex',
|
||||
err_login: 'Login failed. Please try again.',
|
||||
logout_btn: 'Logout',
|
||||
page_description: '🧷 Select binding type and optional settings, then upload your file — get a ready scan.',
|
||||
card_file: 'File',
|
||||
@@ -1339,6 +1355,9 @@
|
||||
page_title: 'pdf2scan — Online-PDF-Scan',
|
||||
logo_subtitle: 'PDF online in gescannte Dokumente umwandeln',
|
||||
login_btn: 'Anmelden',
|
||||
login_via_tg: 'Über Telegram',
|
||||
login_via_yandex: 'Über Yandex',
|
||||
err_login: 'Anmeldung fehlgeschlagen. Bitte erneut versuchen.',
|
||||
logout_btn: 'Abmelden',
|
||||
page_description: '🧷 Wählen Sie den Bindungstyp und optionale Einstellungen, laden Sie dann Ihre Datei hoch — erhalten Sie einen fertigen Scan.',
|
||||
card_file: 'Datei',
|
||||
@@ -1443,6 +1462,9 @@
|
||||
page_title: 'pdf2scan — scan PDF en ligne',
|
||||
logo_subtitle: 'Convertir des PDF en documents scannés en ligne',
|
||||
login_btn: 'Connexion',
|
||||
login_via_tg: 'Via Telegram',
|
||||
login_via_yandex: 'Via Yandex',
|
||||
err_login: 'Échec de connexion. Réessayez.',
|
||||
logout_btn: 'Déconnexion',
|
||||
page_description: '🧷 Sélectionnez le type de reliure et les paramètres optionnels, puis téléchargez votre fichier — obtenez un scan prêt à l\'emploi.',
|
||||
card_file: 'Fichier',
|
||||
@@ -1547,6 +1569,9 @@
|
||||
page_title: 'pdf2scan — scansione PDF online',
|
||||
logo_subtitle: 'Converti PDF in documenti scansionati online',
|
||||
login_btn: 'Accedi',
|
||||
login_via_tg: 'Via Telegram',
|
||||
login_via_yandex: 'Via Yandex',
|
||||
err_login: 'Accesso non riuscito. Riprova.',
|
||||
logout_btn: 'Esci',
|
||||
page_description: '🧷 Seleziona il tipo di rilegatura e le impostazioni opzionali, poi carica il file — ottieni una scansione pronta.',
|
||||
card_file: 'File',
|
||||
@@ -1651,6 +1676,9 @@
|
||||
page_title: 'pdf2scan — escaneo PDF en línea',
|
||||
logo_subtitle: 'Convierte PDF en documentos escaneados en línea',
|
||||
login_btn: 'Iniciar sesión',
|
||||
login_via_tg: 'Con Telegram',
|
||||
login_via_yandex: 'Con Yandex',
|
||||
err_login: 'Error de inicio de sesión. Inténtalo de nuevo.',
|
||||
logout_btn: 'Cerrar sesión',
|
||||
page_description: '🧷 Selecciona el tipo de encuadernación y configuraciones opcionales, luego sube tu archivo — obtén un escaneo listo.',
|
||||
card_file: 'Archivo',
|
||||
@@ -1755,6 +1783,9 @@
|
||||
page_title: 'pdf2scan — digitalização PDF online',
|
||||
logo_subtitle: 'Converta PDF em documentos digitalizados online',
|
||||
login_btn: 'Entrar',
|
||||
login_via_tg: 'Via Telegram',
|
||||
login_via_yandex: 'Via Yandex',
|
||||
err_login: 'Falha no login. Tente novamente.',
|
||||
logout_btn: 'Sair',
|
||||
page_description: '🧷 Selecione o tipo de encadernação e configurações opcionais, depois faça upload do arquivo — obtenha uma digitalização pronta.',
|
||||
card_file: 'Arquivo',
|
||||
@@ -2103,22 +2134,53 @@
|
||||
} catch (e) { /* тихо */ }
|
||||
}
|
||||
|
||||
let sessionUser = null; // из /api/me (вход через Яндекс/VK)
|
||||
|
||||
function renderHeaderAuth() {
|
||||
const loginBtn = document.getElementById('tg-login-header-btn');
|
||||
const userInfo = document.getElementById('tg-user-info');
|
||||
if (tgUser) {
|
||||
const name = tgUser
|
||||
? (tgUser.first_name + (tgUser.last_name ? ' ' + tgUser.last_name : ''))
|
||||
: (sessionUser ? sessionUser.name : null);
|
||||
if (name) {
|
||||
loginBtn.style.display = 'none';
|
||||
userInfo.style.display = 'flex';
|
||||
document.getElementById('tg-user-name').textContent =
|
||||
tgUser.first_name + (tgUser.last_name ? ' ' + tgUser.last_name : '');
|
||||
const photo = document.getElementById('tg-user-photo');
|
||||
photo.style.display = 'none';
|
||||
document.getElementById('tg-user-name').textContent = name;
|
||||
document.getElementById('tg-user-photo').style.display = 'none';
|
||||
} else {
|
||||
loginBtn.style.display = 'flex';
|
||||
userInfo.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
// ── Меню входа (Telegram / Яндекс) ────────────────────────────────────────
|
||||
function toggleLoginMenu(e) {
|
||||
e.stopPropagation();
|
||||
const m = document.getElementById('login-menu');
|
||||
m.style.display = (m.style.display === 'none' || !m.style.display) ? 'block' : 'none';
|
||||
}
|
||||
function closeLoginMenu() {
|
||||
const m = document.getElementById('login-menu');
|
||||
if (m) m.style.display = 'none';
|
||||
}
|
||||
document.addEventListener('click', closeLoginMenu);
|
||||
|
||||
async function doLogout() {
|
||||
try { await fetch('/api/auth/logout', { method: 'POST' }); } catch (e) {}
|
||||
sessionUser = null;
|
||||
logoutTg(); // чистит localStorage TG + перерисовывает шапку
|
||||
}
|
||||
|
||||
async function loadMe() {
|
||||
try {
|
||||
const r = await fetch('/api/me');
|
||||
const d = await r.json();
|
||||
sessionUser = d.logged_in ? d : null;
|
||||
} catch (e) { sessionUser = null; }
|
||||
renderHeaderAuth();
|
||||
if (sessionUser) loadHistory();
|
||||
}
|
||||
|
||||
// ── Авторизация через бота ────────────────────────────────────────────────
|
||||
let _authPollInterval = null;
|
||||
let _authToken = null;
|
||||
@@ -2171,6 +2233,16 @@
|
||||
tgUser = loadSavedAuth();
|
||||
renderHeaderAuth();
|
||||
if (tgUser) loadHistory();
|
||||
if (!tgUser) loadMe(); // проверяем cookie-сессию (вход через Яндекс/VK)
|
||||
// Возврат после OAuth: чистим ?login и показываем ошибку при неудаче
|
||||
(function () {
|
||||
const p = new URLSearchParams(location.search);
|
||||
if (p.has('login')) {
|
||||
const v = p.get('login');
|
||||
try { history.replaceState({}, '', location.pathname); } catch (_) {}
|
||||
if (v === 'error') showError(t('err_login'));
|
||||
}
|
||||
})();
|
||||
|
||||
// ── Drop zone ─────────────────────────────────────────────────────────────
|
||||
const dropZone = document.getElementById('drop-zone');
|
||||
|
||||
Reference in New Issue
Block a user