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 설치해야함
- 각 소셜 로그인 설정
Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.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 |