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

sghaha님의 프로필 이미지
sghaha

작성한 질문수

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

AuthGaurd, canActivate관련

작성

·

359

0

 

안녕하세요 강의를 하며 passport 기능 따라구현하는 중에 막힌곳이 있어서 문의드립니다.

로그인 쪽 개발중 프론트엔드에서 요청을 하면 

canActivate중에 문제가 있는지

401 에러를 뱉습니다.

 

가드가 컨트롤러 앞단에있는 거의 가장 처음 트래픽을 맞이하는 부분이라고 이해만 하고 

canActivate에 대한 이해가 없어서

이부분에서 에러를 뱉어내서 조금 막막하네요

 

어떤 부분을 공부하거나 

찾아봐야 할지 문의드립니다.

 


@Injectable()
export class LocalAuthGuard extends AuthGuard('local') {
async canActivate(context: ExecutionContext): Promise<boolean> {
console.log('가드'); //로그 정상적으로 찍힘
console.log(context); //로그 찍힘
const can = await super.canActivate(context);
console.log(can); //이 로그가 찍히기 전에 401 에러뱉고 끝.
프론트 엔드 응답값은 {"success":false,"code":401,"data":"Unauthorized"}

if (can) {
const request = context.switchToHttp().getRequest();
console.log('login for cookie');
await super.logIn(request);
}

return true;
}
}

답변 3

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

super.canActivate 함수는 AuthGuard('local')의 메서드입니다. 이 부분은 localStrategy에서 validate 메서드 부분을 보셔야 합니다.

https://github.com/ZeroCho/sleact/blob/master/nest-typeorm/src/auth/local.strategy.ts

0

sghaha님의 프로필 이미지
sghaha
질문자

해결했습니다

local.strategy.ts에서 super부분을

아래와 같이 하지않고 그냥 super()로 했네요

공식문서랑 강의랑 번갈아 가면서 복붙하다보니 이부분을 놓쳤습니다.

대충 보니 usernameField를 email로 지정하지 않으면 기본적으로 username으로 받아오나봅니다.

constructor(private authService: AuthService) {
super({ usernameField: 'email', passwordField: 'password' });
}

0

sghaha님의 프로필 이미지
sghaha
질문자

 

현재 만들어주신 프론트엔드에서 보내는것처럼

로그인을

email, password로 보내는것이 아니라

 

포트스맨으로

username, password로 보내면 정상 작동하는것으로 보입니다.

 

어딘가에 email로 써야 할것을 username으로 쓴것같은 느낌입니다.

sghaha님의 프로필 이미지
sghaha

작성한 질문수

질문하기