auth-service-nestjs
Version:
Authorization service for lightweight systems
109 lines (107 loc) • 3.23 kB
text/typescript
import {
Body,
Controller,
Get,
HttpCode,
HttpException,
HttpStatus,
Post,
Req,
Res,
} from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { JWT_Refresh, LoginParams, LogoutParams } from './auth.dto';
import { UserItem } from 'src/users/users.dto';
import { AuthService } from './auth.service';
import {
ACCESS_TOKEN_COOKIE_NAME,
BRUTE_FORCE_LOGIN_DELAY,
BRUTE_FORCE_LOGIN_LIMIT,
BRUTE_FORCE_LOGIN_TTL,
BRUTE_FORCE_WHOAMI_LIMIT,
BRUTE_FORCE_WHOAMI_TTL,
} from 'src/utils/const';
import { setCookie } from './auth.utils';
import { ErrorMessage } from 'src/utils/error';
import { delay } from 'src/utils/time';
import { Throttle } from '@nestjs/throttler';
export class AuthController {
constructor(private authService: AuthService) {}
async login(
body: LoginParams,
response: Response,
): Promise<JWT_Refresh> {
try {
const tokens = await this.authService.login(body);
setCookie(response, tokens.access);
return {
refreshToken: tokens.refresh,
};
} catch (e) {
await delay(+BRUTE_FORCE_LOGIN_DELAY); //brute force protect
throw e;
}
}
async logout(
body: LogoutParams,
response: Response,
request: Request,
): Promise<number> {
if ('cookies' in request) {
const accessToken = request.cookies[ACCESS_TOKEN_COOKIE_NAME];
const { login } = await this.authService.getUserInfoByToken(accessToken);
if (login === body.login) {
setCookie(response, '');
return this.authService.logout(body);
}
}
throw new HttpException(ErrorMessage.BadRequest, HttpStatus.BAD_REQUEST);
}
async refresh(
{ refreshToken }: JWT_Refresh,
response: Response,
): Promise<JWT_Refresh> {
const tokens = await this.authService.refresh(refreshToken);
setCookie(response, tokens.access);
return {
refreshToken: tokens.refresh,
};
}
async whoAmi( request: Request): Promise<UserItem> {
if ('cookies' in request) {
const accessToken = request.cookies[ACCESS_TOKEN_COOKIE_NAME];
return this.authService.getUserInfoByToken(accessToken);
}
throw new HttpException(ErrorMessage.BadRequest, HttpStatus.BAD_REQUEST);
}
}