Closes#123
Refs #122 (backend part only; frontend/docs/specs остаются в своих репозиториях)
Проблема
refresh_token cookie выставлялась без Max-Age/Expires, поэтому браузер/PWA удалял её при закрытии, хотя Session и refresh JWT живут 7 дней. После обновления PWA (закрыть все окна) приходилось вводить логин и пароль заново.
Изменения
fix (53ade94): maxAge: REFRESH_TTL_MS в cookieOptions(); константа экспортируется из auth.service.ts, так что срок cookie и Session.expiresAt задаются одним значением. clearCookie не меняется (Express 5 сам убирает maxAge и ставит Expires в прошлом).
test: cookie policy в test/app.e2e-spec.ts теперь требует Max-Age=604800 у выданной и ротированной cookie, а у очищенной Max-Age быть не должно. Остальные атрибуты проверяются точным набором.
chore (0dd98b2): Node 24.21.0 → 24.22.1 в .nvmrc, Dockerfile, engines (package.json, package-lock.json) и eslint.config.mjs (#122). На 24.21.x app.e2e-spec.ts падает по SIGABRT из better-sqlite3 (nodejs/node#63985).
Проверки (Node 24.22.1)
npm run lint, typecheck:app, typecheck:test: чисто.
node test/sqlite.cjs app.e2e-spec.ts: 19/19. Без правки в src два тестa cookie policy падают.
npm run verify: 40 наборов, 288 тестов, зелёный (до правки eslint.config.mjs; после неё повторно прогнан npm run lint).
Влияние на релиз
Пользователи с уже выданной сессионной cookie должны один раз войти заново после этого релиза; дальше вход сохраняется на 7 дней с продлением при каждом refresh.
Вне PR
Фронт: не разлогинивать при 5xx/сетевой ошибке refresh во время деплоя (отдельная Issue во frontend).
Closes #123
Refs #122 (backend part only; frontend/docs/specs остаются в своих репозиториях)
## Проблема
`refresh_token` cookie выставлялась без `Max-Age`/`Expires`, поэтому браузер/PWA удалял её при закрытии, хотя Session и refresh JWT живут 7 дней. После обновления PWA (закрыть все окна) приходилось вводить логин и пароль заново.
## Изменения
- `fix` (53ade94): `maxAge: REFRESH_TTL_MS` в `cookieOptions()`; константа экспортируется из `auth.service.ts`, так что срок cookie и `Session.expiresAt` задаются одним значением. `clearCookie` не меняется (Express 5 сам убирает `maxAge` и ставит `Expires` в прошлом).
- `test`: cookie policy в `test/app.e2e-spec.ts` теперь требует `Max-Age=604800` у выданной и ротированной cookie, а у очищенной `Max-Age` быть не должно. Остальные атрибуты проверяются точным набором.
- `chore` (0dd98b2): Node `24.21.0` → `24.22.1` в `.nvmrc`, `Dockerfile`, `engines` (`package.json`, `package-lock.json`) и `eslint.config.mjs` (#122). На 24.21.x `app.e2e-spec.ts` падает по SIGABRT из better-sqlite3 (nodejs/node#63985).
## Проверки (Node 24.22.1)
- `npm run lint`, `typecheck:app`, `typecheck:test`: чисто.
- `node test/sqlite.cjs app.e2e-spec.ts`: 19/19. Без правки в `src` два тестa cookie policy падают.
- `npm run verify`: 40 наборов, 288 тестов, зелёный (до правки `eslint.config.mjs`; после неё повторно прогнан `npm run lint`).
## Влияние на релиз
Пользователи с уже выданной сессионной cookie должны один раз войти заново после этого релиза; дальше вход сохраняется на 7 дней с продлением при каждом refresh.
## Вне PR
Фронт: не разлогинивать при 5xx/сетевой ошибке refresh во время деплоя (отдельная Issue во `frontend`).
The refresh cookie had no Max-Age, so browsers dropped it on close
while the Session stayed valid for 7 days. Set maxAge from
REFRESH_TTL_MS, the same constant behind Session.expiresAt.
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.
Closes #123
Refs #122 (backend part only; frontend/docs/specs остаются в своих репозиториях)
Проблема
refresh_tokencookie выставлялась безMax-Age/Expires, поэтому браузер/PWA удалял её при закрытии, хотя Session и refresh JWT живут 7 дней. После обновления PWA (закрыть все окна) приходилось вводить логин и пароль заново.Изменения
fix(53ade94):maxAge: REFRESH_TTL_MSвcookieOptions(); константа экспортируется изauth.service.ts, так что срок cookie иSession.expiresAtзадаются одним значением.clearCookieне меняется (Express 5 сам убираетmaxAgeи ставитExpiresв прошлом).test: cookie policy вtest/app.e2e-spec.tsтеперь требуетMax-Age=604800у выданной и ротированной cookie, а у очищеннойMax-Ageбыть не должно. Остальные атрибуты проверяются точным набором.chore(0dd98b2): Node24.21.0→24.22.1в.nvmrc,Dockerfile,engines(package.json,package-lock.json) иeslint.config.mjs(#122). На 24.21.xapp.e2e-spec.tsпадает по SIGABRT из better-sqlite3 (nodejs/node#63985).Проверки (Node 24.22.1)
npm run lint,typecheck:app,typecheck:test: чисто.node test/sqlite.cjs app.e2e-spec.ts: 19/19. Без правки вsrcдва тестa cookie policy падают.npm run verify: 40 наборов, 288 тестов, зелёный (до правкиeslint.config.mjs; после неё повторно прогнанnpm run lint).Влияние на релиз
Пользователи с уже выданной сессионной cookie должны один раз войти заново после этого релиза; дальше вход сохраняется на 7 дней с продлением при каждом refresh.
Вне PR
Фронт: не разлогинивать при 5xx/сетевой ошибке refresh во время деплоя (отдельная Issue во
frontend).0dd98b292btoec934a34b5