728x90
pnpm add @nestjs/passport passport
pnpm add passport-google-oauth20 passport-kakao passport-naver passport-apple
pnpm add -D @types/passport-google-oauth20 @types/passport-kakao @types/passport-naver @types/passport-apple

 

 

- auth.module.ts

import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { JwtGoogleStrategy } from 'src/commons/auth/jwt-social-google.strategy';
import { JwtNaverStrategy } from 'src/commons/auth/jwt-social-naver.strategy';
import { JwtKakaoStrategy } from 'src/commons/auth/jwt-social-kakao.strategy';

@Module({
  imports: [],
  providers: [
    AuthService, //
    JwtGoogleStrategy,
    JwtKakaoStrategy,
    JwtNaverStrategy,
  ],
  controllers: [
    AuthController, //
  ],
})
export class AuthModule {}

 

- auth.controller.ts

import { Controller, Get, Req, Res, UseGuards } from '@nestjs/common';
import { AuthService } from './auth.service';
import { DynamicAuthGuard } from './guards/dynamic-auth.guard';

interface IOAuthUser {
  user: {
    id: string;
    provider: string;
  };
}

@Controller()
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @Get('signup/:social')
  @UseGuards(DynamicAuthGuard)
  SignUpGoogle(
    @Req() req: Request & IOAuthUser, //
    @Res() res: Response,
  ) {
    console.log(req.user);
  }
}

 

- AuthGuard 변형

import { CanActivate, ExecutionContext } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

// const DYNAMISC_AUTH_GUARD = {
//   google: new (class extends AuthGuard('google') {})(),
//   kakao: new (class extends AuthGuard('kakao') {})(),
//   naver: new (class extends AuthGuard('naver') {})(),
// };

const DYNAMISC_AUTH_GUARD = ['google', 'kakao', 'naver'].reduce(
  (prev, curr) => {
    return { ...prev, [curr]: new (class extends AuthGuard(curr) {})() };
  },
  {},
);

export class DynamicAuthGuard implements CanActivate {
  canActivate(context: ExecutionContext) {
    const { social } = context.switchToHttp().getRequest().params;
    return DYNAMISC_AUTH_GUARD[social].canActivate(context);
  }
}

 

- 전략 구글

현재 카카오랑 네이버는 이메일주소를 주지 않음.

때문에 각 소셜에 등록된 이메일의 고유 아이디번호랑 소셜(provider)로 구분했음.

import { PassportStrategy } from '@nestjs/passport';
import { Profile, Strategy } from 'passport-google-oauth20';

export class JwtGoogleStrategy extends PassportStrategy(Strategy, 'google') {
  constructor() {
    super({
      clientID: process.env.SOCIAL_GOOGLE_ID,
      clientSecret: process.env.SOCIAL_GOOGLE_SECRET,
      callbackURL: `${process.env.SOCIAL_CALLBACK_URL}/google`,
      scope: ['email'],
    });
  }

  validate(accessToken: string, refreshToken: string, profile: Profile) {
    // console.log(profile);

    return {
      id: profile.id,
      provider: profile.provider,
    };
  }
}

 

- passport랑 각 소셜 passport 설치해야함

 

 

 

- 각 소셜 로그인 설정

https://console.cloud.google.com/projectselector2/apis/dashboard?hl=ko&organizationId=0&supportedpurview=project

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

https://developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

https://developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

 

728x90

'코딩 > Nest.js' 카테고리의 다른 글

Guard 기본적 느낌  (0) 2024.10.20
Header에 id:password  (0) 2024.10.18
GraphQL (미완)  (0) 2024.06.10
Swagger  (0) 2024.04.24
GlobalFilters  (0) 2024.04.22

+ Recent posts