-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merge: 리프레시 토큰 적용 및 API 문서 포맷 변경 #25
Conversation
- req-credential-body.dto.ts -> req-auth-body.dto.ts - res-credential.dto.ts -> res-auth.dto.ts - req-auth-token.dto.ts 추가 Related to #21
- 컨트롤러에서 리프레시 토큰, 엑세스 토큰을 가져오는 로직을 데코레이터로 분리 - AllowAny를 데코레이터로 이동 Related to #21
- 리프레시 토큰을 쿠키에 저장하도록 설정 - 쿠키 설정을 위한 모듈 설치 - 쿠키 설정을 위한 모듈 설정 - 쿠키 설정을 위한 모듈을 main.ts에 적용 - 리프레시 토큰을 가지고 액세스 토큰을 재발급하는 로직 추가 Related to #21
- 패키지 설치 - Swagger 문서를 Scalar 문서로 변경 - main.ts에 Scalar 설정 추가 - /api prefix 제거 - setGlobalPrefix 제외 - 문서 url path를 api/swagger -> /reference로 변경 Related to #20
- 리프레시 토큰 쿠키의 만료시간을 2주로 설정 Related to #21
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
수고하셨습니다
refreshToken의 필요성이랑 JWT 방식의 인증의 flow를 배울 수 있어서 좋았습니다
@SwaggerAPI({ name: '로그인', allowAny: true, model: AuthResponse }) | ||
async signIn( | ||
@Body() request: UserCredential, | ||
@Res({ passthrough: true }) response: Response, | ||
) { | ||
const result = await this.authService.signInWith(request.toCredentials()); | ||
response.cookie('refreshToken', result.refreshToken, cookieOptions); | ||
return ResponseEntity.OK_WITH( | ||
`Successfully login ${request.email}`, | ||
new CredentialResponse(response), | ||
result, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
refreshToken은 보이는데 accessToken은 같이 발급이 안되나요?
accessToken은 유효기간이 어느정도 되나요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
로그인을 하면 리프레시 토큰과 액세스 토큰이 한번에 발급됩니다.
리프레시 토큰은 쿠키에 저장하고 액세스 토큰은 AuthResponse 클래스로 직렬화해서 Response Body로 보내집니다.
accessToken은 유효기간이 1시간으로 설정했고 리프레시 토큰의경우 쿠키 만료시간인 14일로 지정했습니다.
AuthResponse
backend/src/auth/res-auth.dto.ts
import { ApiProperty } from '@nestjs/swagger';
import { Session } from '@supabase/supabase-js';
import { Exclude, Expose } from 'class-transformer';
export class AuthResponse {
@Exclude() private readonly _accessToken: string;
@Exclude() private readonly _refreshToken: string;
@Exclude() private readonly _expiresIn: number;
@Exclude() private readonly _tokenType: string;
constructor(data: Session) {
this._accessToken = data.access_token;
this._refreshToken = data.refresh_token;
this._expiresIn = data.expires_in;
this._tokenType = data.token_type;
}
@Expose()
@ApiProperty({
description: '로그인이 성공한 후 반환된 Access Token 입니다.',
})
get accessToken(): string {
return this._accessToken;
}
@Exclude()
@ApiProperty({
description: '로그인이 성공한 후 반환된 Refresh Token 입니다.',
})
get refreshToken(): string {
return this._refreshToken;
}
@Expose()
@ApiProperty({
description: 'Access Token의 만료 시간입니다.',
})
get expiresIn(): number {
return this._expiresIn;
}
@Expose()
@ApiProperty({
description: 'Access Token의 타입입니다.',
})
get tokenType(): string {
return this._tokenType;
}
}
로그인 결과 Json
response 에서 accessToken이 보여집니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 확인했습니다
유효기간은 1시간이군요 감사합니다
PR 체크리스트
아래 항목을 확인해 주세요:
PR 유형
이 PR은 어떤 종류의 변경을 가져오나요?
관련 이슈
이슈 번호: #20 #21
현재 동작은 무엇인가요?
새로운 동작은 무엇인가요?
이 PR은 호환성 변경을 도입하나요?
기타 정보
API 문서 스크린샷
인증 관련 참고링크들