본문 바로가기
카테고리 없음

passport

by 개발자doc 2024. 7. 24.
목차
1. passport라이브러리?
2. 사용법
1. passport 라이브러리
  • OAuth를 사용하기 위한 node의 인증 미들웨어

기존에 OAuth를 사용하여 인증을 할 때 코드를 통해 토큰을 발급받고 그 토큰으로 사용자의 정보를 가져오는 등 과정이 복잡하였다. 이러한 과정을 간소화하고 필요한 정보를 사용할 수 있도록 하기 위해 개발되었다. 

2. 사용법

1) 설치

passport는 외부모듈이기 때문에 설치를 해주어야 한다.

npm i @nestjs/passport passport passport-google

2) 모듈

모듈에서 passportModule을 가져와 사용할 수 있도록 포함시키고 Strategy에 대한 의존성을 추가해준다.

@Module({
  imports: [PassportModule],
  controllers: [AuthController],
  providers: [AuthService, GoogleStrategy],
})

 

3) 컨트롤러

passport를 통해 OAuth인증을 시도할 때 가드를 이용하는데 어떤 사이트의 인증을 사용할 것인지 지정하는데 나는 예시로 google을 사용하였다. 클라이언트가 해당 경로로 인증을 요청한다면 passport는 가드를 통해 Strategy에 지정된 정보로 인증 서버에 접속을 하게 되고 정상적으로 인증이 완료되면 리디렉트 경로에 재요청을 하게 된다.

재요청을 통해 호출된 메서드에서 정보를 받아올 수 있으며 현재 사이트의 로그인, 회원가입 등에 사용자 정보를 이용할 수 있다.

@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) { }
  
  @Get("google")
  @UseGuards(AuthGuard("google"))
  googleAuth(@Req() req: Request) {

  }
  
  // 정상적으로 인증이 완료되면 인증서버는 해당 경로로 재요청 
  @Get("google/callback")
  googleCallback(@Req()res:Request){
      console.log(req.user);
      // 사용자 정보를 처리하는 로직
      
  }
}

4) Strategy

사실 상 인증의 핵심부분으로 인증 사이트에서 프로젝트를 생성했을 때 제공되는 인증에 필요한 정보와 인증에 성공했을 때 사용자의 정보를 제공받는 것이 Strategy다. 인증 서버에 접속하기 위한 정보와 재요청 경로에 대한 정보를 포함하며 인증이 완료되었을 때 validate를 통해 정보를 제공하는데 사용자의 정보는 profile에 있으며 해당 정보를 가공하여 done을 호출하면 재요청시 요청 객체에 사용자의 정보가 포함된다. done를 호출할 때는 첫번째 인자에 에러에 대한 정보, 두번째는 필요한 사용자의 정보를 포함한다. 

export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
    constructor() {
        super({
            clientID: process.env.GOOGLE_CLIENT_ID,
            clientSecret: process.env.GOOGLE_SECRET_KEY,
            callbackURL: "http://testcoffeetree.store:3000/auth/google/callback",
            scope: ["openid", "profile", "email"]
        })
    }
    validate(accessToken: string, refrashToken: string, profile: Profile, done: Function) {
        try {
            const { _json, id, displayName, provider } = profile;
            const user = {
                loginId: _json.email,
                password: id,
                nickname: displayName,
                oauthType: provider,
                imgpath: _json.picture,
                accessToken
            }
            done(null, user);
            return user;
        } catch (error) {
            console.log(error);
        }
    }
}