인프런 커뮤니티 질문&답변

airedu7269님의 프로필 이미지

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

Public Route 정리하기

스웨거 문서에 Basic, Bearer를 적용하는 방법에 대해 질문 드립니다.

24.10.02 22:28 작성

·

148

0

AccessToken, RefreshToken 강의 내용을 모두 마친 후에 스웨거 문서 작성 방법에 대해 궁금한 점이 있어 질문 드립니다.

 

@Headers()를 사용하여 rawToken 값을 전달하는 경우 스웨거 문서에서는 다음과 같이 @ApiBasicAuth('basic'), @ApiBearerAuth('bearer') 형식을 작성을 해야하는지 질문 드립니다.

 

import { Body, Controller, Headers, Post, UseGuards } from '@nestjs/common';
import { AuthFacade } from '@root/resource/auth/auth.facade';
import { BasicTokenGuard } from '@root/common/guard/basic-token.guard';
import { RefreshTokenGuard } from '@root/common/guard/bearer-token.guard';
import { IsPublic } from '@root/common/decorator/is-public.decorator';
import { ApiBasicAuth, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
import {
    AccessAndRefreshTokenResponse,
    AccessTokenResponse,
    RefreshTokenResponse,
} from '@root/resource/auth/dto/response/token-response.dto';

@ApiTags('Auth API')
@Controller('v1/auth')
export class AuthController {
    constructor(private readonly authFacade: AuthFacade) {}

    @ApiOperation({ summary: '로그인', description: 'Authorization Basic 이메일:비밀번호 방식으로 로그인합니다.' })
    @ApiBasicAuth('basic')
    @ApiOkResponse({ type: AccessAndRefreshTokenResponse })
    @IsPublic()
    @UseGuards(BasicTokenGuard)
    @Post('login')
    async login(@Headers('authorization') rawToken: string) {
        return await this.authFacade.loginWithEmail(rawToken);
    }

    @ApiOperation({ summary: '회원가입', description: '이메일, 비밀번호로 회원가입을 진행합니다.' })
    @ApiOkResponse({ type: AccessAndRefreshTokenResponse })
    @IsPublic()
    @Post('register')
    async register(@Body('email') email: string, @Body('password') password: string) {
        return await this.authFacade.registerWithEmail(email, password);
    }

    @ApiOperation({ summary: 'AccessToken 갱신', description: 'RefreshToken으로 AccessToken을 갱신합니다.' })
    @ApiBearerAuth('bearer')
    @ApiOkResponse({ type: AccessTokenResponse })
    @IsPublic()
    @UseGuards(RefreshTokenGuard)
    @Post('token/access')
    generateAccessToken(@Headers('authorization') rawToken: string) {
        return this.authFacade.generateAccessToken(rawToken);
    }

    @ApiOperation({ summary: 'RefreshToken 갱신', description: 'RefreshToken으로 RefreshToken을 갱신합니다.' })
    @ApiBearerAuth('bearer')
    @ApiOkResponse({ type: RefreshTokenResponse })
    @IsPublic()
    @UseGuards(RefreshTokenGuard)
    @Post('token/refresh')
    generateRefreshToken(@Headers('authorization') rawToken: string) {
        return this.authFacade.generateRefreshToken(rawToken);
    }
}

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

2024. 10. 05. 16:30

안녕하세요!

ApiBasicAuth, ApiBearerAuth를 사용하시는게 맞습니다!

아래 링크를 참고 해주세요!

https://docs.nestjs.com/openapi/security

감사합니다!

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 02. 22:31

안녕하세요, 인프런 AI 인턴입니다. airedu7269님.

스웨거 문서에 Basic, Bearer를 적용하는 방법에 대한 질문을 주셨습니다. 이와 관련하여 유사한 논의가 진행된 몇 가지 질문과 그에 대한 답변을 참고해 보시기 바랍니다.

  1. auth/token/access, auth/token/refresh 엔드포인트에 대한 Guard 적용

    • 이 질문에서는 BearerTokenGuard와 같은 가드를 적용함에 있어 refreshToken과 관련된 엔드포인트에 대해 다른 가드를 생성할 필요가 있는지에 대해 논의하고 있습니다. 기본 구조와 작동 방식이 어떻게 이루어지는지 참고해 보시면 도움이 될 것입니다.
  2. guard와 controller 토큰 추출 / 디코드 중복 코드 관련 질문

    • 여기서는 Guard를 통해 토큰을 추출하고 디코드하는 부분에 대한 코드를 중복 처리할 때 고려해야 할 사항들에 대해 자세히 설명하고 있습니다.
  3. async와 await 로직을 사용해야 하는 기준을 잘 모르겠어요

    • 비동기 작업에서 asyncawait 로직을 사용해야 하는 기준과 NestJS 컨트롤러 및 서비스에서 그 적용 방법에 대해 설명하고 있습니다.
  4. 토큰 만료에 대한 예외처리 질문

    • 토큰 만료 시 예외 처리를 위한 best practice를 볼 수 있습니다. Guard와 예외 처리를 어떻게 활용할 수 있는지에 대한 힌트를 얻으실 수 있을 것입니다.

각 항목에서 다루고 있는 내용과 질문에 대해 간단히 요약해 드렸습니다. 스웨거 문서에서는 @ApiBasicAuth@ApiBearerAuth 같은 어노테이션을 사용하여 인증 흐름을 명확히 기술할 수 있으며, 이것이 설정된 엔드포인트에서 동작하는 Guard와 연동되어 API 문서를 더 직관적으로 만들 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.