Repository navigation
feat(account): верификация email и сброс пароля (итер. 37) - #42
Merged
Merged
Conversation
На базе auth из итер. 36: аккаунт может нести опциональный email с верификацией, добавлен флоу «забыл пароль» со сбросом и разлогином всех сессий. - store: миграция 0003 (sqlite+postgres) — accounts.email (частичный UNIQUE) + email_verified; таблица account_tokens одноразовых токенов (SHA-256, kind, used_at). Методы AccountByEmail/SetEmailVerified/UpdatePassword/ RevokeAllRefreshTokens/CreateAccountToken/ConsumeAccountToken (атомарное одноразовое потребление под гонкой). CreateAccount получил email. - account: Mailer (интерфейс) + LogMailer (dev, печатает токен в лог); NewService с опциями WithMailer/WithTokenTTLs. Register(+email) шлёт токен верификации; VerifyEmail; RequestPasswordReset (анти-энумерация — всегда nil); ResetPassword (валидация пароля ДО расхода токена, смена + отзыв ВСЕХ refresh). validateEmail через net/mail. - api: POST /api/verify-email, /api/request-password-reset, /api/reset-password (все под рейт-лимитом); /me отдаёт email + email_verified; ErrEmailTaken→409. - cmd/server: LogMailer в wiring; env ARENA_VERIFY_TTL/ARENA_RESET_TTL. - web: опциональный email при регистрации, кнопка forgot, обработка ссылок ?verify=/?reset= (токен стирается из URL), email+статус в профиле. - docs: README RU/EN + architecture. Провод/симуляция не тронуты (игровые стражи не гонялись); security-review — HIGH/MEDIUM findings нет. make check + integration + live-smoke зелёные.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что
Итерация 37 — верификация email + сброс пароля, поверх auth-фундамента итер. 36.
Аккаунт может нести опциональный email с верификацией; добавлен флоу «забыл пароль»
со сбросом пароля и разлогином всех сессий.
Зачем
Восстановление доступа (забытый пароль) и подтверждение владения email — базовые
возможности аккаунтов, которых не хватало. Сброс завязан на отзыв сессий из итер. 36:
смена пароля гасит все refresh-токены (разлогин везде).
Как
0003(sqlite+postgres):accounts.email(опционален,частичный UNIQUE-индекс) +
email_verified; таблицаaccount_tokensодноразовыхтокенов (в БД только SHA-256,
kindразличает verify/reset,used_at). МетодыAccountByEmail/SetEmailVerified/UpdatePassword/RevokeAllRefreshTokens/CreateAccountToken/ConsumeAccountToken(атомарное одноразовое потребление подгонкой: tx +
UPDATE … WHERE used_at=0с проверкой RowsAffected).CreateAccountполучил параметр email.
Mailer+LogMailer(dev: печатает токен в лог, SMTP нет);NewServiceс опциямиWithMailer/WithTokenTTLs.Register(+email)шлёт токенверификации;
VerifyEmail;RequestPasswordReset(анти-энумерация — всегда безошибки);
ResetPassword(валидация пароля ДО расхода токена, смена + отзыв ВСЕХrefresh).
validateEmailчерезnet/mail.POST /api/verify-email,/api/request-password-reset,/api/reset-password(под пер-IP рейт-лимитом);
/meотдаётemail+email_verified;ErrEmailTaken→409.LogMailerв wiring; envARENA_VERIFY_TTL(24h) /ARENA_RESET_TTL(1h).forgot, обработка ссылок изписем
?verify=/?reset=(токен стирается из URL после обработки), email + статусверификации в профиле.
docs/architecture.md.Границы
Провод (
internal/protocol) и симуляция не тронуты → игровые стражи не гонялись(прецедент итер. 21/36). Бэкенд-фича безопасности → security-review: HIGH/MEDIUM нет
(одноразовые токены только SHA-256 и одноразовы; сброс валидирует пароль до расхода
токена и отзывает все сессии; reset без энумерации;
LogMailer— dev-стаб сself-warning).
Тестирование
make check(vet +-race) иmake integration— зелёные.store(email + занятость, verify, смена пароля, одноразовые токены —kind/повтор/просрочка, revoke-all; Postgres-сьют дополнен
account_tokens),account(register+email+verify, email taken/invalid, полный reset-флоу с разлогиноми одноразовостью — через recording-mailer),
api(end-to-end verify + reset по HTTP)./me(verified); reset weak(400)/ok(204)/reuse(401); login old(401)/new(200).
node --check web/game.js.BENCHMARKS.md не трогался — горячего пути нет.