128 lines
6.4 KiB
HTML
128 lines
6.4 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>设置双因素认证 (2FA)</title>
|
|
<link href="https://tailwind.gvsds.com" rel="stylesheet">
|
|
<link href="https://cdn.gvsds.com/font-awesome/css/all.min.css" rel="stylesheet" media="print" onload="this.media='all'">
|
|
</head>
|
|
<body class="bg-gray-100 min-h-screen">
|
|
<div class="container mx-auto px-4 py-8 max-w-3xl">
|
|
<header class="mb-8">
|
|
<h1 class="text-3xl font-bold text-gray-800">设置双因素认证 (2FA)</h1>
|
|
<p class="text-gray-600 mt-2">增强您账户的安全性</p>
|
|
</header>
|
|
|
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
|
{% if messages %}
|
|
<div class="mb-6">
|
|
{% for category, message in messages %}
|
|
<div class="p-4 rounded-md {% if category == 'success' %}bg-green-100 text-green-800{% else %}bg-red-100 text-red-800{% endif %}">
|
|
{{ message }}
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
{% endwith %}
|
|
|
|
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
|
|
{% if existing2fa and existing2fa.IsEnabled == 1 %}
|
|
<div class="mb-4 p-4 bg-green-50 border border-green-200 rounded-md">
|
|
<p class="text-green-800"><i class="fas fa-check-circle mr-2"></i>双因素认证已启用</p>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if step == 1 %}
|
|
<div class="mb-6">
|
|
<h2 class="text-xl font-semibold mb-3">什么是双因素认证?</h2>
|
|
<p class="text-gray-700 mb-4">
|
|
双因素认证 (2FA) 为您的账户增加了额外的安全层。启用后,登录时除了密码外,
|
|
您还需要输入通过手机应用生成的验证码。
|
|
</p>
|
|
<p class="text-gray-700 mb-4">
|
|
设置过程:
|
|
</p>
|
|
<ol class="list-decimal list-inside text-gray-700 mb-4 pl-4">
|
|
<li>点击"开始设置"按钮生成一个二维码</li>
|
|
<li>使用认证应用(如Google Authenticator、Authy等)扫描二维码</li>
|
|
<li>输入应用生成的6位验证码完成验证</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<form method="post" class="flex flex-col sm:flex-row gap-4">
|
|
<button type="submit" name="generate" class="bg-blue-600 text-white py-2 px-6 rounded-md hover:bg-blue-700 transition duration-200 flex-1">
|
|
<i class="fas fa-qrcode mr-2"></i>开始设置
|
|
</button>
|
|
|
|
{% if existing2fa and existing2fa.IsEnabled == 1 %}
|
|
<button type="submit" name="disable" class="bg-red-600 text-white py-2 px-6 rounded-md hover:bg-red-700 transition duration-200 flex-1">
|
|
<i class="fas fa-times-circle mr-2"></i>禁用2FA
|
|
</button>
|
|
{% endif %}
|
|
</form>
|
|
{% endif %}
|
|
|
|
{% if step == 2 %}
|
|
<div class="mb-6">
|
|
<h2 class="text-xl font-semibold mb-3">扫描二维码</h2>
|
|
<p class="text-gray-700 mb-4">
|
|
使用您的认证应用(如Google Authenticator、Authy等)扫描下方的二维码,
|
|
或手动输入密钥:<strong class="bg-gray-100 px-2 py-1 rounded">{{ secret }}</strong>
|
|
</p>
|
|
|
|
<div class="flex justify-center mb-6">
|
|
<div class="bg-white p-4 border border-gray-200 rounded-md shadow-sm">
|
|
<img src="data:image/png;base64,{{ qr_code }}" alt="2FA 二维码" class="max-w-full h-auto">
|
|
</div>
|
|
</div>
|
|
|
|
<p class="text-gray-700 mb-4">
|
|
扫描完成后,输入应用生成的6位验证码以完成设置:
|
|
</p>
|
|
|
|
<form method="post">
|
|
<div class="mb-4">
|
|
<label for="token" class="block text-gray-700 mb-2">验证码</label>
|
|
<input type="text" id="token" name="token"
|
|
class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
placeholder="6位数字验证码" maxlength="6" required>
|
|
</div>
|
|
|
|
<div class="flex gap-4">
|
|
<button type="submit" name="verify" class="bg-green-600 text-white py-2 px-6 rounded-md hover:bg-green-700 transition duration-200">
|
|
<i class="fas fa-check mr-2"></i>验证并启用
|
|
</button>
|
|
<a href="{{ url_for('GERP.Setup2fa') }}" class="bg-gray-600 text-white py-2 px-6 rounded-md hover:bg-gray-700 transition duration-200">
|
|
<i class="fas fa-arrow-left mr-2"></i>返回
|
|
</a>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<div class="text-center">
|
|
<a href="/" class="text-blue-600 hover:text-blue-800 transition duration-200">
|
|
<i class="fas fa-home mr-1"></i>返回首页
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
// 自动聚焦到验证码输入框
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const tokenInput = document.getElementById('token');
|
|
if (tokenInput) {
|
|
tokenInput.focus();
|
|
|
|
// 只允许输入数字
|
|
tokenInput.addEventListener('input', function(e) {
|
|
this.value = this.value.replace(/[^0-9]/g, '');
|
|
});
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|