nordabiz/templates/auth/2fa_setup.html
Maciej Pienczyn cebe52f303 refactor: Rebranding i aktualizacja modelu AI
- Zmiana nazwy: "Norda Biznes Hub" → "Norda Biznes Partner"
- Aktualizacja modelu AI: Gemini 2.0 Flash → Gemini 3 Flash
- Zachowano historyczne odniesienia w timeline i dokumentacji

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 14:08:39 +01:00

237 lines
6.3 KiB
HTML

{% extends "base.html" %}
{% block title %}Konfiguracja 2FA - Norda Biznes Partner{% endblock %}
{% block container_class %}container-narrow{% endblock %}
{% block extra_css %}
<style>
.setup-container {
max-width: 600px;
margin: 0 auto;
padding: var(--spacing-2xl) 0;
}
.setup-card {
background-color: var(--surface);
padding: var(--spacing-2xl);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-lg);
}
.setup-header {
text-align: center;
margin-bottom: var(--spacing-xl);
}
.setup-header h1 {
font-size: var(--font-size-2xl);
color: var(--text-primary);
margin-bottom: var(--spacing-sm);
}
.setup-steps {
margin-bottom: var(--spacing-xl);
}
.step {
display: flex;
gap: var(--spacing-md);
margin-bottom: var(--spacing-lg);
}
.step-number {
width: 32px;
height: 32px;
background-color: var(--primary);
color: white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
flex-shrink: 0;
}
.step-content h3 {
font-size: var(--font-size-base);
color: var(--text-primary);
margin-bottom: var(--spacing-xs);
}
.step-content p {
font-size: var(--font-size-sm);
color: var(--text-secondary);
margin: 0;
}
.qr-container {
text-align: center;
padding: var(--spacing-xl);
background-color: white;
border-radius: var(--radius-lg);
margin-bottom: var(--spacing-lg);
}
.qr-code {
max-width: 200px;
margin: 0 auto var(--spacing-md);
}
.qr-code img {
width: 100%;
height: auto;
}
.secret-key {
background-color: var(--background);
padding: var(--spacing-md);
border-radius: var(--radius);
font-family: monospace;
font-size: var(--font-size-sm);
word-break: break-all;
margin-top: var(--spacing-md);
}
.form-group {
margin-bottom: var(--spacing-lg);
}
.form-label {
display: block;
font-weight: 500;
margin-bottom: var(--spacing-sm);
color: var(--text-primary);
}
.form-input {
width: 100%;
padding: var(--spacing-md);
border: 1px solid var(--border);
border-radius: var(--radius);
font-size: var(--font-size-xl);
text-align: center;
letter-spacing: 0.5em;
}
.form-input:focus {
outline: none;
border-color: var(--primary);
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
}
.btn-primary {
width: 100%;
padding: var(--spacing-md) var(--spacing-xl);
background-color: var(--primary);
color: white;
border: none;
border-radius: var(--radius);
font-size: var(--font-size-base);
font-weight: 600;
cursor: pointer;
}
.btn-primary:hover {
background-color: var(--primary-dark, #1d4ed8);
}
.cancel-link {
text-align: center;
margin-top: var(--spacing-lg);
}
.cancel-link a {
color: var(--text-secondary);
text-decoration: none;
}
.apps-list {
display: flex;
gap: var(--spacing-md);
justify-content: center;
flex-wrap: wrap;
margin-top: var(--spacing-sm);
}
.app-badge {
background-color: var(--background);
padding: var(--spacing-xs) var(--spacing-md);
border-radius: var(--radius);
font-size: var(--font-size-xs);
color: var(--text-secondary);
}
</style>
{% endblock %}
{% block content %}
<div class="setup-container">
<div class="setup-card">
<div class="setup-header">
<h1>🔐 Konfiguracja 2FA</h1>
</div>
<div class="setup-steps">
<div class="step">
<div class="step-number">1</div>
<div class="step-content">
<h3>Pobierz aplikację uwierzytelniającą</h3>
<p>Użyj jednej z poniższych aplikacji na swoim telefonie:</p>
<div class="apps-list">
<span class="app-badge">Google Authenticator</span>
<span class="app-badge">Microsoft Authenticator</span>
<span class="app-badge">Authy</span>
</div>
</div>
</div>
<div class="step">
<div class="step-number">2</div>
<div class="step-content">
<h3>Zeskanuj kod QR</h3>
<p>Otwórz aplikację i zeskanuj poniższy kod QR:</p>
</div>
</div>
</div>
<div class="qr-container">
<!-- QR Code generated from URI -->
<div class="qr-code">
<img src="https://api.qrserver.com/v1/create-qr-code/?size=200x200&data={{ qr_uri|urlencode }}" alt="QR Code">
</div>
<p style="font-size: var(--font-size-sm); color: var(--text-secondary);">
Nie możesz zeskanować? Wprowadź ręcznie:
</p>
<div class="secret-key">{{ secret }}</div>
</div>
<div class="step">
<div class="step-number">3</div>
<div class="step-content">
<h3>Wprowadź kod weryfikacyjny</h3>
<p>Wpisz 6-cyfrowy kod z aplikacji:</p>
</div>
</div>
<form method="POST" action="{{ url_for('settings_2fa') }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<input type="hidden" name="action" value="verify_setup">
<div class="form-group">
<input type="text" name="code" class="form-input"
maxlength="6" pattern="[0-9]{6}" inputmode="numeric"
placeholder="000000" autocomplete="one-time-code" required>
</div>
<button type="submit" class="btn-primary">
Aktywuj 2FA
</button>
</form>
<div class="cancel-link">
<a href="{{ url_for('settings_2fa') }}">Anuluj</a>
</div>
</div>
</div>
{% endblock %}