- 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>
237 lines
6.3 KiB
HTML
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 %}
|