Refresh-токен как Bearer → 401 при живой session (та же session после этого успешно refresh-ится).
Refresh cookie: HttpOnly, SameSite=Lax, Path=/api/v1/auth, без Domain/Max-Age; Secure в production на issue/rotate/clear; development снимает только Secure.
Signed expired access → 401 (те же claims без expiry → 200); signed expired refresh с совпадающим hash в живой session → 401 без Set-Cookie (с валидным exp → 200); DB-expired session → 401, без Set-Cookie, session удалена.
Failed refresh не отдаёт Set-Cookie (cookie победителя не затирается); concurrent SQLite winner usable после loser/replay — уже покрыто существующим тестом, проверено мутациями.
Verification
npm run test:sqlite -- app.e2e-spec.ts: 19/19.
npm run test:e2e: exit 0, все suites passed.
npm run verify: exit 0, 40 suites / 288 tests.
Мутации (временные, откатаны): удалён type-check в JwtStrategy; Secure always on/off; httpOnly off; SameSite strict; path /; добавлен Domain; ignoreExpiration на access и refresh; проигнорирован DB expiresAt; replay удаляет session; failed refresh чистит cookie; ослаблен CAS — каждая ловится минимум одним тестом.
Ограничение: проверяются HTTP-заголовки Set-Cookie, а не browser enforcement cookie.
Breaking Changes
Нет.
## Summary
Тесты границ авторизации в существующем `test/app.e2e-spec.ts` (настоящие подписанные токены + реальная SQLite session). Production-код не менялся.
## Linked Issue
Closes WealthLedger/backend#61
## Changes
- Refresh-токен как Bearer → 401 при живой session (та же session после этого успешно refresh-ится).
- Refresh cookie: HttpOnly, SameSite=Lax, Path=/api/v1/auth, без Domain/Max-Age; Secure в production на issue/rotate/clear; development снимает только Secure.
- Signed expired access → 401 (те же claims без expiry → 200); signed expired refresh с совпадающим hash в живой session → 401 без Set-Cookie (с валидным exp → 200); DB-expired session → 401, без Set-Cookie, session удалена.
- Failed refresh не отдаёт Set-Cookie (cookie победителя не затирается); concurrent SQLite winner usable после loser/replay — уже покрыто существующим тестом, проверено мутациями.
## Verification
- `npm run test:sqlite -- app.e2e-spec.ts`: 19/19.
- `npm run test:e2e`: exit 0, все suites passed.
- `npm run verify`: exit 0, 40 suites / 288 tests.
- Мутации (временные, откатаны): удалён type-check в JwtStrategy; Secure always on/off; httpOnly off; SameSite strict; path `/`; добавлен Domain; ignoreExpiration на access и refresh; проигнорирован DB expiresAt; replay удаляет session; failed refresh чистит cookie; ослаблен CAS — каждая ловится минимум одним тестом.
- Ограничение: проверяются HTTP-заголовки Set-Cookie, а не browser enforcement cookie.
## Breaking Changes
Нет.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Тесты границ авторизации в существующем
test/app.e2e-spec.ts(настоящие подписанные токены + реальная SQLite session). Production-код не менялся.Linked Issue
Closes WealthLedger/backend#61
Changes
Verification
npm run test:sqlite -- app.e2e-spec.ts: 19/19.npm run test:e2e: exit 0, все suites passed.npm run verify: exit 0, 40 suites / 288 tests./; добавлен Domain; ignoreExpiration на access и refresh; проигнорирован DB expiresAt; replay удаляет session; failed refresh чистит cookie; ослаблен CAS — каждая ловится минимум одним тестом.Breaking Changes
Нет.