Как организовать двухфакторную аутентификацию

«Как организовать двухфакторную аутентификацию» — вопрос из категории Безопасность, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для 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 из БД

Основные шаги:

  1. Генерируем секрет при включении 2FA
  2. Сохраняем секрет в БД
  3. Показываем QR-код пользователю (через Google Authenticator и т.д.)
  4. При логине проверяем введённый код

Для резервных кодов можно сгенерировать набор случайных строк. Для SMS-кодов использовать сервисы вроде Twilio.