Skip to content

refactor: improvements to auth module #102

@loudsheep

Description

@loudsheep

Drobne zmiany:

  • race condition przy odświeżaniu tokenów - gdy dwa żądania trafią jednocześnie z tym samym refresh tokenem, oba przejdą weryfikację zanim którekolwiek zdąży usunąć token z bazy. Naprawić przez zastąpienie findUnique + delete atomowym deleteMany i sprawdzenie czy count > 0 - jeśli nie, token był już użyty
  • w ResetPasswordDto dodać @IsNotEmpty nad polem token, żebby pusty string nie przechodził walidacji

Te ważniejsze:

obecnie zwracamy refresh_token wraz z access_token w jednym JSON w /auth/login. jest to spoko, ale żeby front mógł z tego skorzystać to musi ten refresh_token gdzieś zapisać w przeglądarce. najlpewniej byłby to localstorage ale że on jest podatny na XSS to po naszej stronie zamienimy żeby refresh_token był jako cookie i nie dostępny dla JS w przeglądarce

  • w main.ts dodać app.use(cookieParser()); żęby api widziało te cookies
  • dodanie nowych zmiennych środowiskowych w .env.example oraz do walidacji Joi w app.module.ts - REFRESH_TOKEN_TTL_DAYS
  • nie musimy zmieniać serwisu, ale w login() w kontrolerze trzeba ustawić żeby nie zwracał json z refresh_token, tylko ustawiał go do cookie, a access_token zwracał jak dotychczas
res.cookie('refresh_token', refresh_token, {
  httpOnly: true,
  secure: configService.getOrThrow<string>('NODE_ENV') === 'production',
  sameSite: 'strict',
  maxAge: configService.getOrThrow<number>('REFRESH_TOKEN_TTL_DAYS') * 24 * 60 * 60 * 1000,
  domain: configService.getOrThrow<string>('APP_DOMAIN'),
  path: '/api/v3/auth',
});
  • endpoint POST /auth/logout który usuwa refresh token z bazy oraz usuwa cookie z refresh_token

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

Status

Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions