Ответ
Для 2FA в Go можно использовать TOTP (Time-Based One-Time Password) через библиотеку github.com/pquerna/otp. Пример:
import (
"github.com/pquerna/otp/totp"
)
// Генерация секрета и QR-кода
key, _ := totp.Generate(totp.GenerateOpts{
Issuer: "MyApp",
AccountName: "user@example.com",
})
// Сохранить key.Secret() в БД для пользователя
// Отправить key.URL() как QR-код клиенту
// Валидация кода
valid := totp.Validate(code, secret) // secret из БД
Основные шаги:
- Генерируем секрет при включении 2FA
- Сохраняем секрет в БД
- Показываем QR-код пользователю (через Google Authenticator и т.д.)
- При логине проверяем введённый код
Для резервных кодов можно сгенерировать набор случайных строк. Для SMS-кодов использовать сервисы вроде Twilio.