Skip to content

Commit 8dfdc50

Browse files
feat: 인증 성공 후 jwt 토큰 발급
1 parent 5026834 commit 8dfdc50

File tree

4 files changed

+154
-6
lines changed

4 files changed

+154
-6
lines changed

apps/backend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@nestjs/common": "^10.0.0",
2525
"@nestjs/config": "^3.3.0",
2626
"@nestjs/core": "^10.0.0",
27+
"@nestjs/jwt": "^10.2.0",
2728
"@nestjs/mapped-types": "*",
2829
"@nestjs/passport": "^10.0.3",
2930
"@nestjs/platform-express": "^10.0.0",

apps/backend/src/auth/auth.controller.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import { Controller, Get, UseGuards, Req } from '@nestjs/common';
22
import { AuthGuard } from '@nestjs/passport';
33
import { AuthService } from './auth.service';
4+
import { JwtService } from '@nestjs/jwt';
5+
import { JwtAuthGuard } from './guards/jwt-auth.guard';
46

57
@Controller('auth')
68
export class AuthController {
7-
constructor(private readonly authService: AuthService) {}
9+
constructor(
10+
private readonly authService: AuthService,
11+
private readonly jwtService: JwtService,
12+
) {}
813

914
@Get('naver')
1015
@UseGuards(AuthGuard('naver'))
@@ -17,9 +22,14 @@ export class AuthController {
1722
@UseGuards(AuthGuard('naver'))
1823
async naverCallback(@Req() req) {
1924
// 네이버 인증 후 사용자 정보 반환
25+
const user = req.user;
26+
// TODO: 후에 권한 (workspace 조회, 편집 기능)도 payload에 추가
27+
const payload = { sub: user.id, provider: user.provider };
28+
const token = this.jwtService.sign(payload);
2029
return {
2130
message: '네이버 로그인 성공',
22-
user: req.user,
31+
user,
32+
accessToken: token,
2333
};
2434
}
2535

@@ -34,8 +44,25 @@ export class AuthController {
3444
@UseGuards(AuthGuard('kakao'))
3545
async kakaoCallback(@Req() req) {
3646
// 카카오 인증 후 사용자 정보 반환
47+
const user = req.user;
48+
// TODO: 후에 권한 (workspace 조회, 편집 기능)도 payload에 추가
49+
const payload = { sub: user.id, provider: user.provider };
50+
const token = this.jwtService.sign(payload);
3751
return {
3852
message: '카카오 로그인 성공',
53+
user,
54+
accessToken: token,
55+
};
56+
}
57+
58+
// Example 1: 로그인한 사용자만 접근할 수 있는 엔드포인트
59+
// auth/profile
60+
@Get('profile')
61+
@UseGuards(JwtAuthGuard) // JWT 인증 검사
62+
async getProfile(@Req() req) {
63+
// JWT 토큰을 검증하고 사용자 정보 반환
64+
return {
65+
message: '인증된 사용자 정보',
3966
user: req.user,
4067
};
4168
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { AuthGuard } from '@nestjs/passport';
3+
4+
@Injectable()
5+
export class JwtAuthGuard extends AuthGuard('jwt') {}

yarn.lock

Lines changed: 119 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1589,6 +1589,14 @@
15891589
path-to-regexp "3.3.0"
15901590
tslib "2.7.0"
15911591

1592+
"@nestjs/jwt@^10.2.0":
1593+
version "10.2.0"
1594+
resolved "https://registry.yarnpkg.com/@nestjs/jwt/-/jwt-10.2.0.tgz#6aa35a04922d19c6426efced4671620f92e6dbd0"
1595+
integrity sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==
1596+
dependencies:
1597+
"@types/jsonwebtoken" "9.0.5"
1598+
jsonwebtoken "9.0.2"
1599+
15921600
"@nestjs/mapped-types@*", "@nestjs/[email protected]":
15931601
version "2.0.6"
15941602
resolved "https://registry.yarnpkg.com/@nestjs/mapped-types/-/mapped-types-2.0.6.tgz#d2d8523709fd5d872a9b9e0c38162746e2a7f44e"
@@ -3256,6 +3264,13 @@
32563264
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
32573265
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
32583266

3267+
3268+
version "9.0.5"
3269+
resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz#0bd9b841c9e6c5a937c17656e2368f65da025588"
3270+
integrity sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==
3271+
dependencies:
3272+
"@types/node" "*"
3273+
32593274
"@types/linkify-it@^3":
32603275
version "3.0.5"
32613276
resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.5.tgz#1e78a3ac2428e6d7e6c05c1665c242023a4601d8"
@@ -4449,6 +4464,11 @@ [email protected]:
44494464
dependencies:
44504465
node-int64 "^0.4.0"
44514466

4467+
4468+
version "1.0.1"
4469+
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
4470+
integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==
4471+
44524472
buffer-from@^1.0.0:
44534473
version "1.1.2"
44544474
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
@@ -5204,6 +5224,13 @@ eastasianwidth@^0.2.0:
52045224
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
52055225
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
52065226

5227+
5228+
version "1.0.11"
5229+
resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
5230+
integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
5231+
dependencies:
5232+
safe-buffer "^5.0.1"
5233+
52075234
52085235
version "1.1.1"
52095236
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -7038,6 +7065,39 @@ jsonfile@^6.0.1:
70387065
optionalDependencies:
70397066
graceful-fs "^4.1.6"
70407067

7068+
7069+
version "9.0.2"
7070+
resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3"
7071+
integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==
7072+
dependencies:
7073+
jws "^3.2.2"
7074+
lodash.includes "^4.3.0"
7075+
lodash.isboolean "^3.0.3"
7076+
lodash.isinteger "^4.0.4"
7077+
lodash.isnumber "^3.0.3"
7078+
lodash.isplainobject "^4.0.6"
7079+
lodash.isstring "^4.0.1"
7080+
lodash.once "^4.0.0"
7081+
ms "^2.1.1"
7082+
semver "^7.5.4"
7083+
7084+
jwa@^1.4.1:
7085+
version "1.4.1"
7086+
resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
7087+
integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
7088+
dependencies:
7089+
buffer-equal-constant-time "1.0.1"
7090+
ecdsa-sig-formatter "1.0.11"
7091+
safe-buffer "^5.0.1"
7092+
7093+
jws@^3.2.2:
7094+
version "3.2.2"
7095+
resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
7096+
integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
7097+
dependencies:
7098+
jwa "^1.4.1"
7099+
safe-buffer "^5.0.1"
7100+
70417101
katex@^0.16.10:
70427102
version "0.16.11"
70437103
resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.11.tgz#4bc84d5584f996abece5f01c6ad11304276a33f5"
@@ -7240,11 +7300,36 @@ lodash.debounce@^4.0.8:
72407300
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
72417301
integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
72427302

7303+
lodash.includes@^4.3.0:
7304+
version "4.3.0"
7305+
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
7306+
integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==
7307+
7308+
lodash.isboolean@^3.0.3:
7309+
version "3.0.3"
7310+
resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
7311+
integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==
7312+
7313+
lodash.isinteger@^4.0.4:
7314+
version "4.0.4"
7315+
resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
7316+
integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==
7317+
7318+
lodash.isnumber@^3.0.3:
7319+
version "3.0.3"
7320+
resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
7321+
integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==
7322+
72437323
lodash.isplainobject@^4.0.6:
72447324
version "4.0.6"
72457325
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
72467326
integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
72477327

7328+
lodash.isstring@^4.0.1:
7329+
version "4.0.1"
7330+
resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
7331+
integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==
7332+
72487333
lodash.memoize@^4.1.2:
72497334
version "4.1.2"
72507335
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
@@ -7255,6 +7340,11 @@ lodash.merge@^4.6.2:
72557340
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
72567341
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
72577342

7343+
lodash.once@^4.0.0:
7344+
version "4.1.1"
7345+
resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
7346+
integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==
7347+
72587348
[email protected], lodash@^4.17.21:
72597349
version "4.17.21"
72607350
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -7826,7 +7916,7 @@ [email protected]:
78267916
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
78277917
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
78287918

7829-
[email protected], ms@^2.0.0, ms@^2.1.3:
7919+
[email protected], ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
78307920
version "2.1.3"
78317921
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
78327922
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -9504,7 +9594,16 @@ string-length@^4.0.1:
95049594
char-regex "^1.0.2"
95059595
strip-ansi "^6.0.0"
95069596

9507-
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
9597+
"string-width-cjs@npm:string-width@^4.2.0":
9598+
version "4.2.3"
9599+
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
9600+
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
9601+
dependencies:
9602+
emoji-regex "^8.0.0"
9603+
is-fullwidth-code-point "^3.0.0"
9604+
strip-ansi "^6.0.1"
9605+
9606+
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
95089607
version "4.2.3"
95099608
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
95109609
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -9536,7 +9635,14 @@ string_decoder@~1.1.1:
95369635
dependencies:
95379636
safe-buffer "~5.1.0"
95389637

9539-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
9638+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
9639+
version "6.0.1"
9640+
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
9641+
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
9642+
dependencies:
9643+
ansi-regex "^5.0.1"
9644+
9645+
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
95409646
version "6.0.1"
95419647
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
95429648
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -10425,7 +10531,7 @@ word-wrap@^1.2.5:
1042510531
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
1042610532
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
1042710533

10428-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
10534+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
1042910535
version "7.0.0"
1043010536
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
1043110537
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -10443,6 +10549,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0:
1044310549
string-width "^4.1.0"
1044410550
strip-ansi "^6.0.0"
1044510551

10552+
wrap-ansi@^7.0.0:
10553+
version "7.0.0"
10554+
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
10555+
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
10556+
dependencies:
10557+
ansi-styles "^4.0.0"
10558+
string-width "^4.1.0"
10559+
strip-ansi "^6.0.0"
10560+
1044610561
wrap-ansi@^8.1.0:
1044710562
version "8.1.0"
1044810563
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"

0 commit comments

Comments
 (0)