# E2E report: stage-2fa

Запущен: 2026-05-29T12:41:12.460Z
Длительность: 3.3с

**Итог:** 6 ✓ / 0 ✗ / 0 ⚠ / 0 ◯ (всего 6)

## ✓ Step tfa01_setup_and_status: Создать org → status показывает enabled=false

Длительность: 1760мс

| Тип | Проверка | Результат |
|---|---|---|
| api | GET /status → 200 | ✓ 200 |
| api | enabled = false для нового user | ✓ enabled=false |

## ✓ Step tfa02_enroll: POST /api/me/2fa/enroll → sharedKey + otpauth-URI, alreadyEnabled=false

Длительность: 140мс

| Тип | Проверка | Результат |
|---|---|---|
| api | POST /enroll → 200 | ✓ 200 |
| api | sharedKey не пустой | ✓ key.len=32 |
| api | authenticatorUri начинается с otpauth://totp/ | ✓ otpauth://totp/food-market%3astage-2fa-1780058472460%40food-… |
| api | alreadyEnabled = false | ✓ already=false |

## ✓ Step tfa03_verify_invalid_code: POST /api/me/2fa/verify с кодом 000000 → 400

Длительность: 99мс

| Тип | Проверка | Результат |
|---|---|---|
| api | verify с 000000 → 400 "Неверный код" | ✓ 400 {"error":"Неверный код. Попробуйте ещё раз.","field":"code"} |

## ✓ Step tfa04_verify_valid_code: POST /api/me/2fa/verify с реальным TOTP кодом → 200, enabled=true

Длительность: 172мс

| Тип | Проверка | Результат |
|---|---|---|
| api | verify с реальным TOTP-кодом (612117) → 200 | ✓ 200 {"enabled":true} |
| api | status.enabled = true | ✓ enabled=true |

## ✓ Step tfa05_login_requires_2fa: Логин без otp_code → 400 invalid_grant 2fa_required; с правильным otp_code → 200

Длительность: 735мс

| Тип | Проверка | Результат |
|---|---|---|
| api | Логин без otp_code → 400 с 2fa_required | ✓ 400 {"error":"invalid_grant","error_description":"2fa_required"} |
| api | Логин с правильным otp_code (612117) → 200 | ✓ 200 access=yes |
| api | Логин с неверным otp_code → 400 с 2fa_invalid | ✓ 400 {"error":"invalid_grant","error_description":"2fa_invalid"} |

## ✓ Step tfa06_disable: POST /api/me/2fa/disable с кодом → 200; status показывает enabled=false; повторный enroll выдаёт новый key

Длительность: 382мс

| Тип | Проверка | Результат |
|---|---|---|
| api | disable без кода → 400 | ✓ 400 {"error":"Подтверди отключение текущим кодом из приложения.","field":"code"} |
| api | disable с code (612117) → 200, enabled=false | ✓ 200 {"enabled":false} |
| api | status.enabled = false | ✓ enabled=false |
| api | Повторный enroll → новый sharedKey (отличается от старого) | ✓ same=false |

## Summary

- Passed: 6
- Failed: 0
- Warnings: 0
- Skipped: 0

## Critical bugs

Нет.
