Skip to content

Commit

Permalink
feat: 카카오 로그인
Browse files Browse the repository at this point in the history
  • Loading branch information
raymondanythings committed Dec 31, 2023
1 parent 748d81f commit 4782dc1
Showing 1 changed file with 59 additions and 28 deletions.
87 changes: 59 additions & 28 deletions src/oauth/oauth.service.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,39 @@
import { AuthService } from './../auth/auth.service';
import { UserService } from './../users/user.service';
import { BadRequestException, Injectable, Logger } from '@nestjs/common';
import axios from 'axios';
import { GoogleUserInfo } from './dtos/google.dto';
import { URL } from 'url';
import { InjectDataSource } from '@nestjs/typeorm';
import { DataSource } from 'typeorm';
import axios from 'axios';
import { JWT } from 'src/auth/dtos/jwt.dto';
import { User } from 'src/users/entities/user.entity';
import { DataSource } from 'typeorm';
import { URL } from 'url';
import { AuthService } from './../auth/auth.service';
import { UserService } from './../users/user.service';
import { GoogleUserInfo } from './dtos/google.dto';
import { ServiceProvider } from './dtos/service-provider.dto';
import { JWT } from 'src/auth/dtos/jwt.dto';

export interface KakaoUser {
id: number;
connected_at: string;
properties: Properties;
kakao_account: KakaoAccount;
}

export interface Properties {
nickname: string;
}

export interface KakaoAccount {
profile_nickname_needs_agreement: boolean;
profile: Profile;
has_email: boolean;
email_needs_agreement: boolean;
is_email_valid: boolean;
is_email_verified: boolean;
email: string;
}

export interface Profile {
nickname: string;
}

@Injectable()
export class OauthService {
Expand Down Expand Up @@ -90,48 +115,54 @@ export class OauthService {
}
async userFromKakao(code: string): Promise<JWT> {
try {
const form = new FormData();
form.append('client_id', process.env.KAKAO_CLIENT_ID);
form.append('redirect_uri', process.env.KAKAO_REDIRECT_URL);
form.append('grant_type', 'authorization_code');
form.append('code', code);
const response = await axios.post<{
access_token: string;
token_type: string;
refresh_token: string;
expires_in: number;
scope: string;
refresh_token_expires_in: number;
}>('https://kauth.kakao.com/oauth/token ', form, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
}>(
'https://kauth.kakao.com/oauth/token ',
{
code,
grant_type: 'authorization_code',
client_id: process.env.KAKAO_CLIENT_ID,
redirect_uri: process.env.KAKAO_REDIRECT_URL,
},
});
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
},
);

if (!response.data['access_token']) {
throw new BadRequestException('Access-Token을 받아오지 못 했습니다.');
}
// 회원정보 가져오기
const userUrl = 'https://kapi.kakao.com/v2/user/me';
const userResponse = await axios.get(userUrl, {
const userResponse = await axios.get<KakaoUser>(userUrl, {
params: {
access_token: response.data['access_token'],
},
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
},
});

// const googleUesr = userResponse.data as GoogleUserInfo;
return userResponse.data;
// let user = await this.userService.findByUserEmail(googleUesr.email);
// if (!user) {
// user = await this.userService.create({ email: googleUesr.email });
// }
// const token = this.authService.sign(user.id);
// user.refresh = token.refresh;
// await this.dataSource.getRepository(User).save(user);
// return new JWT(token);
const kakaoUser = userResponse.data;
let user = await this.userService.findByUserEmail(
kakaoUser.kakao_account.email,
);
if (!user) {
user = await this.userService.create({
email: kakaoUser.kakao_account.email,
});
}
const token = this.authService.sign(user.id);
user.refresh = token.refresh;
await this.dataSource.getRepository(User).save(user);
return new JWT(token);
} catch (err) {
this.logger.error(err.message);
throw new BadRequestException('invalid request: ' + err?.message || '');
Expand Down

0 comments on commit 4782dc1

Please sign in to comment.