oauth2 {nest.js} {passport}


overview

strategy ์ƒ์„ฑํ•˜๊ณ  ๋ชจ๋“ˆ๊ณผ ์„œ๋น„์Šค ์ƒ์„ฑํ•˜๊ณ , ์ง์ ‘์ ์œผ๋กœ strategy ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋Š” ์•Š๊ณ  AuthModule์ด๋ผ๋Š” ๊ฐ€๋“œ๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ถ™์—ฌ๋†“๋Š”๊ฑธ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ. controller์—์„œ ์ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ์—”๋“œํฌ์ธํŠธ์— ๊ฐ€๋“œ๋ฅผ ๊ฑธ์–ด๋†“๋Š”๋‹ค. ์‹ค์ œ authenticate ๋‹จ๊ณ„๋ฅผ ์œ„ํ•ด์„œ built-in passport guards๋ฅผ ์‚ฌ์šฉํ•จ.

// src/auth/kakao.strategy.ts
export class KakaoStrategy extends PassportStrategy(Strategy, 'kakao') {
  constructor() {
    super({
      clientID: process.env.KAKAO_CLIENT_ID,
      clientSecret: process.env.KAKAO_CLIENT_SECRET,
      callbackURL: 'http://chltm.mooo.com:3000/auth/kakao',
    });
  }
  async validate(
    accessToken: string,
    refreshToken: string,
    profile: any,
    done: any,
  ) {
    const { id, username, email, provider } = profile;
    console.log(profile);
    const user = {
      id,
      username,
      provider,
      email,
      accessToken,
      refreshToken,
    };
    done(null, user);
  }
}
@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @Get('kakao')
  @UseGuards(AuthGuard('kakao'))
  async kakaoAuth(@Req() req): Promise<any> {
    return this.authService.kakaoLogin(req);
  }
}

Strategy

  1. ์ธ์ฆ ๋‹จ๊ณ„๋ฅผ JWT, OAuth, username/password strategy๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ.
  2. ๊ฒ€์ฆ๋‹จ๊ณ„๋Š” verify callback์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

Kakao Oauth2

https://www.passportjs.org/packages/passport-kakao/

npm i passport-kakao

์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋“ฑ๋ก โŸถ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํƒญ์—์„œ ํ™œ์„ฑํ™” + OpenID Connect + Redirect URI ์„ค์ • โŸถ ํ”Œ๋žซํผ ํƒญ์—์„œ Web ์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ ์ถ”๊ฐ€ โŸถ ์•ฑ ํ‚ค ํƒญ์—์„œ ๊ฐ๊ฐ REST API ํ‚ค์™€ Admin ํ‚ค๋ฅผ Client ID & Secrete Key์— ๋Œ€์‘ํ•˜์—ฌ ์ ‘์†

email์ด ํ•„์ˆ˜๋™์˜๊ฐ€ ์•ˆ๋  ๊ฒƒ์ด๋‹ค. ์ด ๊ฒฝ์šฐ, ๋น„์ฆˆ๋‹ˆ์Šค ํƒญ์œผ๋กœ ๊ฐ€์„œ ๊ฐœ์ธ ๊ฐœ๋ฐœ์ž ๋น„์ฆˆ ์•ฑ์„ ๋“ฑ๋กํ•˜๋ฉด ๋œ๋‹ค.

Google OAuth2