@app.route('/login-2fa', methods=['GET', 'POST'])
def login_2fa():
# 1. Проверяем, есть ли временный ID в сессии
user_id = session.get('pre_auth_user_id')
if not user_id:
return redirect(url_for('login'))
user = User.query.get(user_id)
if request.method == 'POST':
otp = request.form.get('otp')
# 2. Проверяем код
if otp and pyotp.TOTP(user.totp_secret).verify(otp):
# --- ВСТАВЛЯТЬ СЮДА ---
# Убираем временный ID
session.pop('pre_auth_user_id', None)
# Генерируем новый токен сессии
token = secrets.token_hex(24)
# Создаем запись в базе данных (UserSession)
new_session = UserSession(
user_id=user.id,
session_token=token,
ip_address=request.remote_addr,
user_agent=request.headers.get('User-Agent')
)
db.session.add(new_session)
db.session.commit()
# Обновляем основную сессию Flask
session.update({
'user_id': user.id,
'username': user.username,
'session_token': token # Важно: сохраняем токен и в куки
})
return redirect(url_for('dashboard'))
# --- КОНЕЦ ВСТАВКИ ---
else:
flash('Неверный код 2FA', 'danger')
return render_template('login_2fa.html')