Nest.js

NestJS에서 passport-naver와 passport-kakao 로그인 문제점

Dev갱이 2024. 7. 25. 13:03
728x90

Reference

- (https://github.com/naver/passport-naver)

- (https://github.com/rotoshine/passport-kakao)

- (https://orangebrother.dev/blog/%08nestjs-google-oauth-passport)

- (https://github.com/nestjs/passport/blob/master/lib/passport/passport.strategy.ts)

 

NestJS에서 naver로그인과 kakao 로그인을 구현 할때 다운로드 수 와 게시글들을 비교 했을때 선택할 수 있는 라이브러리지만 9년전에 만들어 졌고 typescript를 지원하지 않는 라이브러리라 따로 @types를 설치 해주어야 한다.

문제 1 NestJS에서 사용할 때 필요한 타입과 @types/passport-naver로 설치하는 타입과 전혀 연관성이 없다.

@Injectable()
export class NaverStrategy extends PassportStrategy(Strategy, 'naver') {
	constructor() {
		super({
			clientID: process.env.NAVER_CLIENT_ID!,
			clientSecret: process.env.NAVER_SECRET!,
			callbackURL: process.env.NAVER_CALLBACK_URL!,
		});
	}

	validate(
		accessToken: string,
		refreshToken: string,
		profile: string,
		done: any,
	) {}
}
super에 어떤값이 들어갈 수 있는지 전혀 추론되지 않는다. 아래에는 @types/passport-naver 타입을 설치한 후 여기서 제공하는 타입이다.
export interface StrategyOption {
    clientID: string;
    clientSecret?: string;
    callbackURL: string;

    svcType?: number | undefined;
    authType?: string | undefined;

    authorizationURL?: string | undefined;
    tokenURL?: string | undefined;
    profileURL?: string | undefined;
}

export interface StrategyOptionWithRequest extends StrategyOption {
    passReqToCallback: true;
}

 

문제2 @nestjs/passport 사용시 validate 메서드 구현 추론이 안된다.

@Injectable()
export class NaverStrategy extends PassportStrategy(Strategy, 'naver') {
	constructor() {
		super({
			clientID: process.env.NAVER_CLIENT_ID!,
			clientSecret: process.env.NAVER_SECRET!,
			callbackURL: process.env.NAVER_CALLBACK_URL!,
		});
	}

	validate2(
		accessToken: string,
		refreshToken: string,
		profile: string,
		done: any,
	) {
		done(null);
	}
}
validate2로 이름을 다르게 작성하게되면 아래와 같은 에러가 발생한다. 
TypeError: this.validate is not a function
validate 메서드 구현은 필수다.

 

문제3 validate 메서드에서 req를 가져오고 싶으면 Strategy옵션에서 passReqToCallback옵션을 true로 주어야한다

문서를 보거나 직접 해보지 않으면 validate가 req 파라미터를 사용할 수 있는지 없는지 알 수 가 없다.

 

결론적으로 @types/passport-naver나 @types/passport-kakao는 NestJS에서 @nestjs/passport와 함께 사용 할 때 아무 도움이 안된다.

 

NestJS에서 @nestjs/passport와 함께 사용할 수 있도록 오픈소스 라이브러리를 개발하는게 좋아보인다. 소셜 로그인은 자주 사용하니까 

 

728x90