From c87a1df16e3f8e16b3e1dd96e693ea15cc1d676c Mon Sep 17 00:00:00 2001 From: ssu00 Date: Thu, 30 Jun 2022 20:56:14 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Feat:=20next-auth?= =?UTF-8?q?=EB=A1=9C=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/api/Login/login.jsx | 1 - core/api/apiController.jsx | 1 - core/provider.jsx | 2 +- package-lock.json | 288 ++++++++++++++++++++++++++++++- package.json | 2 + pages/api/auth/[...nextauth].jsx | 82 +++++++++ pages/common/auth/login.jsx | 34 ++-- 7 files changed, 390 insertions(+), 20 deletions(-) create mode 100644 pages/api/auth/[...nextauth].jsx diff --git a/core/api/Login/login.jsx b/core/api/Login/login.jsx index c4722e6..2ec5d4a 100644 --- a/core/api/Login/login.jsx +++ b/core/api/Login/login.jsx @@ -5,6 +5,5 @@ export const login = async (id, pw) => { url: "/login", data: { password: pw, username: id }, }); - console.log("login res=================================", res); return res; }; diff --git a/core/api/apiController.jsx b/core/api/apiController.jsx index 2fdbcf9..0b1cfeb 100644 --- a/core/api/apiController.jsx +++ b/core/api/apiController.jsx @@ -17,7 +17,6 @@ myAxios.interceptors.request.use( myAxios.interceptors.response.use( async function (response) { - console.log("isRefresh====", isRefresh); if (isRefresh) { myAxios(config); return response; diff --git a/core/provider.jsx b/core/provider.jsx index 211e635..24b2ea8 100644 --- a/core/provider.jsx +++ b/core/provider.jsx @@ -37,7 +37,7 @@ const SocketProvider = ({ setAlarmCnt((prev) => prev + 1); }); - myChatRooms.length != 0 && + myChatRooms?.length != 0 && myChatRooms?.forEach((data) => { ws?.subscribe(`/sub/chat/room/${data?.chatroomId}`, (data2) => { setChat(JSON.parse(data2.body)); diff --git a/package-lock.json b/package-lock.json index 189d02c..815c530 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,8 @@ "moment": "^2.29.1", "net": "^1.0.2", "next": "^12.1.0", + "next-auth": "^4.7.0", + "next-redux-cookie-wrapper": "^2.1.2", "next-redux-wrapper": "^7.0.5", "nookies": "^2.5.2", "nprogress": "^0.2.0", @@ -2587,6 +2589,14 @@ "node": ">= 8" } }, + "node_modules/@panva/hkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.2.tgz", + "integrity": "sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/@popperjs/core": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.4.tgz", @@ -5085,8 +5095,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.1.2", @@ -6116,6 +6125,14 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/jose": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.8.3.tgz", + "integrity": "sha512-7rySkpW78d8LBp4YU70Wb7+OTgE3OwAALNVZxhoIhp4Kscp+p/fBkdpxGAMKxvCAMV4QfXBU9m6l9nX/vGwd2g==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-cookie": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", @@ -6387,6 +6404,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/lodash.capitalize": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", @@ -6438,6 +6460,14 @@ "node": ">=10" } }, + "node_modules/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", @@ -6611,6 +6641,62 @@ } } }, + "node_modules/next-auth": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.7.0.tgz", + "integrity": "sha512-boXSIzHvCyNq1Jthi24LLnx12iKBsqsMxUKm5qq9alkfhVMeIRUR/wKP0FPSGc1s9WcGXMS3NmKQfADCEb0wow==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "@panva/hkdf": "^1.0.1", + "cookie": "^0.4.1", + "jose": "^4.3.7", + "oauth": "^0.9.15", + "openid-client": "^5.1.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "engines": { + "node": "^12.19.0 || ^14.15.0 || ^16.13.0" + }, + "peerDependencies": { + "nodemailer": "^6.6.5", + "react": "^17.0.2 || ^18", + "react-dom": "^17.0.2 || ^18" + }, + "peerDependenciesMeta": { + "nodemailer": { + "optional": true + } + } + }, + "node_modules/next-redux-cookie-wrapper": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/next-redux-cookie-wrapper/-/next-redux-cookie-wrapper-2.1.2.tgz", + "integrity": "sha512-FCrsIX2ihVVljkDOu4f5uVi9biL9374jt5M29bo2hDP9zRBtIlzowynNBsxa8VxhY+V9kolUYkemwgtapj2zBg==", + "dependencies": { + "@types/cookie": "^0.4.1", + "cookie": "^0.4.1", + "fast-deep-equal": "^3.1.3", + "immer": "^9.0.6", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lz-string": "^1.4.4", + "nookies": "^2.5.2", + "type-fest": "^2.8.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "next-redux-wrapper": ">=6" + } + }, + "node_modules/next-redux-cookie-wrapper/node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, "node_modules/next-redux-wrapper": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/next-redux-wrapper/-/next-redux-wrapper-7.0.5.tgz", @@ -6717,6 +6803,11 @@ "node": ">=0.10.0" } }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6725,6 +6816,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -6835,6 +6934,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oidc-token-hash": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", + "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6852,6 +6959,23 @@ "node": ">=0.10.0" } }, + "node_modules/openid-client": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.1.7.tgz", + "integrity": "sha512-VNtf/q+fv2Jiqi0ViLVmN3gGMSHF+YUGW6baKA/naoPKkKw4JdvghaP/kXQ/bzRRDWk6VmpCYDcR934UdDs8ug==", + "dependencies": { + "jose": "^4.1.4", + "lru-cache": "^6.0.0", + "object-hash": "^2.0.1", + "oidc-token-hash": "^5.0.1" + }, + "engines": { + "node": "^12.19.0 || ^14.15.0 || ^16.13.0" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -7050,6 +7174,26 @@ "url": "https://opencollective.com/postcss/" } }, + "node_modules/preact": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.8.2.tgz", + "integrity": "sha512-AKGt0BsDSiAYzVS78jZ9qRwuorY2CoSZtf1iOC6gLb/3QyZt+fLT09aYJBjRc/BEcRc4j+j3ggERMdNE43i1LQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.0.tgz", + "integrity": "sha512-+RGwSW78Cl+NsZRUbFW1MGB++didsfqRk+IyRVTaqy+3OjtpKK/6HgBtfszUX0YXMfo41k2iaQSseAHGKEwrbg==", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, "node_modules/prebuild-install": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz", @@ -7085,6 +7229,11 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -8889,6 +9038,17 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.14.0.tgz", + "integrity": "sha512-hQnTQkFjL5ik6HF2fTAM8ycbr94UbQXK364wF930VHb0dfBJ5JBP8qwrR8TaK9zwUEk7meruo2JAUDMwvuxd/w==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -9081,6 +9241,14 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -10907,6 +11075,11 @@ "fastq": "^1.6.0" } }, + "@panva/hkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.2.tgz", + "integrity": "sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==" + }, "@popperjs/core": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.4.tgz", @@ -12798,8 +12971,7 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.1.2", @@ -13578,6 +13750,11 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "jose": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.8.3.tgz", + "integrity": "sha512-7rySkpW78d8LBp4YU70Wb7+OTgE3OwAALNVZxhoIhp4Kscp+p/fBkdpxGAMKxvCAMV4QfXBU9m6l9nX/vGwd2g==" + }, "js-cookie": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", @@ -13814,6 +13991,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "lodash.capitalize": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", @@ -13859,6 +14041,11 @@ "yallist": "^4.0.0" } }, + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==" + }, "mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", @@ -13979,6 +14166,45 @@ "use-subscription": "1.5.1" } }, + "next-auth": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.7.0.tgz", + "integrity": "sha512-boXSIzHvCyNq1Jthi24LLnx12iKBsqsMxUKm5qq9alkfhVMeIRUR/wKP0FPSGc1s9WcGXMS3NmKQfADCEb0wow==", + "requires": { + "@babel/runtime": "^7.16.3", + "@panva/hkdf": "^1.0.1", + "cookie": "^0.4.1", + "jose": "^4.3.7", + "oauth": "^0.9.15", + "openid-client": "^5.1.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + } + }, + "next-redux-cookie-wrapper": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/next-redux-cookie-wrapper/-/next-redux-cookie-wrapper-2.1.2.tgz", + "integrity": "sha512-FCrsIX2ihVVljkDOu4f5uVi9biL9374jt5M29bo2hDP9zRBtIlzowynNBsxa8VxhY+V9kolUYkemwgtapj2zBg==", + "requires": { + "@types/cookie": "^0.4.1", + "cookie": "^0.4.1", + "fast-deep-equal": "^3.1.3", + "immer": "^9.0.6", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lz-string": "^1.4.4", + "nookies": "^2.5.2", + "type-fest": "^2.8.0" + }, + "dependencies": { + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + } + } + }, "next-redux-wrapper": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/next-redux-wrapper/-/next-redux-wrapper-7.0.5.tgz", @@ -14064,11 +14290,21 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -14143,6 +14379,11 @@ "es-abstract": "^1.19.1" } }, + "oidc-token-hash": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", + "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -14157,6 +14398,17 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, + "openid-client": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.1.7.tgz", + "integrity": "sha512-VNtf/q+fv2Jiqi0ViLVmN3gGMSHF+YUGW6baKA/naoPKkKw4JdvghaP/kXQ/bzRRDWk6VmpCYDcR934UdDs8ug==", + "requires": { + "jose": "^4.1.4", + "lru-cache": "^6.0.0", + "object-hash": "^2.0.1", + "oidc-token-hash": "^5.0.1" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -14308,6 +14560,19 @@ "source-map-js": "^1.0.1" } }, + "preact": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.8.2.tgz", + "integrity": "sha512-AKGt0BsDSiAYzVS78jZ9qRwuorY2CoSZtf1iOC6gLb/3QyZt+fLT09aYJBjRc/BEcRc4j+j3ggERMdNE43i1LQ==" + }, + "preact-render-to-string": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.0.tgz", + "integrity": "sha512-+RGwSW78Cl+NsZRUbFW1MGB++didsfqRk+IyRVTaqy+3OjtpKK/6HgBtfszUX0YXMfo41k2iaQSseAHGKEwrbg==", + "requires": { + "pretty-format": "^3.8.0" + } + }, "prebuild-install": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz", @@ -14334,6 +14599,11 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -15728,6 +15998,11 @@ "prelude-ls": "^1.2.1" } }, + "type-fest": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.14.0.tgz", + "integrity": "sha512-hQnTQkFjL5ik6HF2fTAM8ycbr94UbQXK364wF930VHb0dfBJ5JBP8qwrR8TaK9zwUEk7meruo2JAUDMwvuxd/w==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -15893,6 +16168,11 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", diff --git a/package.json b/package.json index 067720e..c9fb846 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,8 @@ "moment": "^2.29.1", "net": "^1.0.2", "next": "^12.1.0", + "next-auth": "^4.7.0", + "next-redux-cookie-wrapper": "^2.1.2", "next-redux-wrapper": "^7.0.5", "nookies": "^2.5.2", "nprogress": "^0.2.0", diff --git a/pages/api/auth/[...nextauth].jsx b/pages/api/auth/[...nextauth].jsx new file mode 100644 index 0000000..c598701 --- /dev/null +++ b/pages/api/auth/[...nextauth].jsx @@ -0,0 +1,82 @@ +import NextAuth from "next-auth"; +import CredentialProvider from "next-auth/providers/credentials"; +import { login } from "../../../core/api/Login"; + +async function refreshAccessToken(access, refresh) { + try { + const url = "http://3.37.39.47:8080/refresh-token"; + const response = await fetch(url, { + headers: { + Authorization: access, + ["X-Access-Token"]: access, + ["X-Refresh-Token"]: refresh, + role: "MENTOR", + }, + method: "POST", + }); + + const refreshedTokens = await response.json(); + console.log("refreshedTokens==", refreshedTokens); + + if (!response.ok) { + throw refreshedTokens; + } + + return { + ...token, + accessToken: refreshedTokens.headers["x-access-token"], + refreshToken: refreshedTokens.headers["x-refresh-token"], + }; + } catch (error) { + console.log(error); + return { + ...token, + error: "RefreshAccessTokenError", + }; + } +} + +export default NextAuth({ + providers: [ + CredentialProvider({ + id: "email-password-credential", + name: "credentials", + credentials: { + username: { label: "Email", type: "email" }, + password: { + label: "Password", + type: "password", + }, + }, + async authorize(credentials, req) { + const res = await login(credentials.username, credentials.password); + if (res?.status == 200) { + return { + accessToken: res.headers["x-access-token"], + refreshToken: res.headers["x-refresh-token"], + role: "MENTOR", + }; + } else { + return "login error"; + } + }, + }), + ], + callbacks: { + async jwt({ token, user, account }) { + console.log("user=", user); + if (user !== "login error") { + token.access = user.accessToken; + token.refresh = user.refreshToken; + token.role = user.role; + } + return token; + }, + async session({ session, token }) { + console.log("session===", session); + session.user.access = token.access; + return session; + }, + }, + pages: { signIn: "/common/auth/login" }, +}); diff --git a/pages/common/auth/login.jsx b/pages/common/auth/login.jsx index 3079a66..735552e 100644 --- a/pages/common/auth/login.jsx +++ b/pages/common/auth/login.jsx @@ -11,6 +11,7 @@ import { login, getUserRoleType } from "../../../core/api/Login"; import { cookieForAuth, removeInfo } from "../../../utils/cookie"; import { IC_Google, IC_Kakao, IC_Logo, IC_Naver } from "../../../icons"; import { NameLogo } from "../../../components/common/icons/nameLogo"; +import { signIn } from "next-auth/react"; const Login = () => { const [username, setUsername] = useState(""); @@ -22,19 +23,26 @@ const Login = () => { }, []); const checkAccount = async () => { - const res = await login(username, password); - if (res.status == 200) { - const role = await getUserRoleType(res.headers["x-access-token"]); - cookieForAuth(res, role); - if (role.loginType === "ROLE_MENTOR") { - router.push("/mentor/myclass/myClassList"); - } - if (role.loginType === "ROLE_MENTEE") { - router.push("/mentee"); - } - } else { - setError(true); - } + const response = await signIn("email-password-credential", { + username, + password, + redirect: false, + }); + console.log("response=", response); + + // const res = await login(username, password); + // if (res.status == 200) { + // const role = await getUserRoleType(res.headers["x-access-token"]); + // cookieForAuth(res, role); + // // if (role.loginType === "ROLE_MENTOR") { + // // router.push("/mentor/myclass/myClassList"); + // // } + // // if (role.loginType === "ROLE_MENTEE") { + // // router.push("/mentee"); + // // } + // } else { + // setError(true); + // } }; const onChangeUsername = (e) => { From 6eadab412c1e3a9f4a520138aa97a1021082742f Mon Sep 17 00:00:00 2001 From: ssu00 Date: Sat, 2 Jul 2022 00:13:12 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=A7=AA=20Test:=20next-auth=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=EB=B0=9C=EA=B8=89=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/_app.jsx | 26 +++++++---- pages/api/auth/[...nextauth].jsx | 75 ++++++++++++++++++-------------- 2 files changed, 60 insertions(+), 41 deletions(-) diff --git a/pages/_app.jsx b/pages/_app.jsx index 8e7c131..e0ee786 100644 --- a/pages/_app.jsx +++ b/pages/_app.jsx @@ -15,6 +15,7 @@ import { allChatRooms } from "../core/api/Chat"; import SocketProvider from "../core/provider"; import { tokenRefresh } from "../core/api/Login"; import { setCookie } from "../utils/cookie"; +import { SessionProvider } from "next-auth/react"; function MyApp({ my, @@ -23,6 +24,7 @@ function MyApp({ newToken, Component, pageProps, + // pageProps: { session, ...pageProps }, }) { const [loading, setLoading] = useState(false); axios.defaults.baseURL = process.env.NEXT_PUBLIC_API_URL; @@ -65,13 +67,21 @@ function MyApp({ - - - + + + {/* {session !== undefined ? ( + + + + ) : ( */} + + {/* )} */} + + ); } @@ -87,7 +97,7 @@ MyApp.getInitialProps = async (context) => { let newToken = ""; if (context.ctx.req && context.ctx.req.headers.cookie) { - console.log("this is req===", context.ctx.req); + // console.log("this is req===", context.ctx.req); // if(context.ctx.req.statusCode==401 && message=="TOKENEXPIRED"){ // tokenRefresh(); // } diff --git a/pages/api/auth/[...nextauth].jsx b/pages/api/auth/[...nextauth].jsx index c598701..592ea04 100644 --- a/pages/api/auth/[...nextauth].jsx +++ b/pages/api/auth/[...nextauth].jsx @@ -2,39 +2,39 @@ import NextAuth from "next-auth"; import CredentialProvider from "next-auth/providers/credentials"; import { login } from "../../../core/api/Login"; -async function refreshAccessToken(access, refresh) { - try { - const url = "http://3.37.39.47:8080/refresh-token"; - const response = await fetch(url, { - headers: { - Authorization: access, - ["X-Access-Token"]: access, - ["X-Refresh-Token"]: refresh, - role: "MENTOR", - }, - method: "POST", - }); +// async function refreshAccessToken(access, refresh) { +// try { +// const url = "http://3.37.39.47:8080/refresh-token"; +// const response = await fetch(url, { +// headers: { +// Authorization: access, +// ["X-Access-Token"]: access, +// ["X-Refresh-Token"]: refresh, +// role: "MENTOR", +// }, +// method: "POST", +// }); - const refreshedTokens = await response.json(); - console.log("refreshedTokens==", refreshedTokens); +// const refreshedTokens = await response.json(); +// console.log("refreshedTokens==", refreshedTokens); - if (!response.ok) { - throw refreshedTokens; - } +// if (!response.ok) { +// throw refreshedTokens; +// } - return { - ...token, - accessToken: refreshedTokens.headers["x-access-token"], - refreshToken: refreshedTokens.headers["x-refresh-token"], - }; - } catch (error) { - console.log(error); - return { - ...token, - error: "RefreshAccessTokenError", - }; - } -} +// return { +// ...token, +// accessToken: refreshedTokens.headers["x-access-token"], +// refreshToken: refreshedTokens.headers["x-refresh-token"], +// }; +// } catch (error) { +// console.log(error); +// return { +// ...token, +// error: "RefreshAccessTokenError", +// }; +// } +// } export default NextAuth({ providers: [ @@ -50,6 +50,7 @@ export default NextAuth({ }, async authorize(credentials, req) { const res = await login(credentials.username, credentials.password); + console.log("res===", res); if (res?.status == 200) { return { accessToken: res.headers["x-access-token"], @@ -57,7 +58,7 @@ export default NextAuth({ role: "MENTOR", }; } else { - return "login error"; + return ""; } }, }), @@ -65,16 +66,24 @@ export default NextAuth({ callbacks: { async jwt({ token, user, account }) { console.log("user=", user); - if (user !== "login error") { + console.log("acc=", account); + if (user) { + console.log("valid user!"); token.access = user.accessToken; token.refresh = user.refreshToken; token.role = user.role; + } else { + console.log("invalid user!"); } return token; }, async session({ session, token }) { console.log("session===", session); - session.user.access = token.access; + // if (token) { + // session.access = token.access; + // session.refresh = token.refresh; + // session.role = token.role; + // } return session; }, }, From 7303841824b50c207f035fe3e7a30f04ac899734 Mon Sep 17 00:00:00 2001 From: Salvation-sub Date: Sat, 2 Jul 2022 04:03:37 +0900 Subject: [PATCH 3/4] =?UTF-8?q?chore:=20=EB=84=A5=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=96=B4=EC=93=B0=ED=95=98=EB=8B=A4=EA=B0=80=ED=91=B8=EC=89=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/api/Login/roleTypeCheck.jsx | 5 +- core/api/Mentee/getLecture.jsx | 5 +- core/api/apiController.jsx | 19 ++- pages/_app.jsx | 103 +++++++-------- pages/api/auth/[...nextauth].jsx | 219 ++++++++++++++++++++++++------- pages/common/auth/login.jsx | 26 ++-- pages/mentee/index.jsx | 51 +++---- 7 files changed, 281 insertions(+), 147 deletions(-) diff --git a/core/api/Login/roleTypeCheck.jsx b/core/api/Login/roleTypeCheck.jsx index 09c6af0..4c107aa 100644 --- a/core/api/Login/roleTypeCheck.jsx +++ b/core/api/Login/roleTypeCheck.jsx @@ -1,9 +1,10 @@ import Api, { METHOD } from "../apiController"; -export const getUserRoleType = async (token) => { +export const getUserRoleType = async () => { const res = await Api({ method: METHOD.GET, url: "/session-user", - headers: { Authorization: token }, + // headers: { Authorization: token }, }); + console.log(res); return res.data; }; diff --git a/core/api/Mentee/getLecture.jsx b/core/api/Mentee/getLecture.jsx index 9df6e88..5a9da34 100644 --- a/core/api/Mentee/getLecture.jsx +++ b/core/api/Mentee/getLecture.jsx @@ -1,15 +1,16 @@ import qs from "qs"; import Api, { METHOD } from "../apiController"; -export const getLecture = async (token, data) => { +export const getLecture = async (data) => { const res = await Api({ method: METHOD.GET, - headers: { Authorization: token }, + // headers: { Authorization: token }, url: "/lectures", params: data, paramsSerializer: (params) => { return qs.stringify(params, { arrayFormat: "repeat" }); }, }); + return res.data; }; diff --git a/core/api/apiController.jsx b/core/api/apiController.jsx index 0b1cfeb..7b87f9f 100644 --- a/core/api/apiController.jsx +++ b/core/api/apiController.jsx @@ -1,4 +1,6 @@ import axios from "axios"; +import { getSession } from "next-auth/react"; + let isRefresh = false; const myAxios = axios.create({ baseURL: process.env.NEXT_PUBLIC_API_URL, @@ -6,24 +8,29 @@ const myAxios = axios.create({ myAxios.interceptors.request.use( async (config) => { - isRefresh = - config.headers.common["X-Access-Token"] === undefined ? false : true; + const defaultHeader = axios.defaults.headers.common.Authorization; + console.log("header=====", defaultHeader); + // if (session) { + // config.headers.common["Authorization"] = defaultHeader; + // } return config; }, (err) => { + console.log(err); return Promise.reject(err); } ); myAxios.interceptors.response.use( async function (response) { - if (isRefresh) { - myAxios(config); - return response; - } + // if (isRefresh) { + // myAxios(config); + // return response; + // } return response; }, async function (error) { + console.log(error.response); return error.response; } ); diff --git a/pages/_app.jsx b/pages/_app.jsx index e0ee786..8a98191 100644 --- a/pages/_app.jsx +++ b/pages/_app.jsx @@ -15,16 +15,15 @@ import { allChatRooms } from "../core/api/Chat"; import SocketProvider from "../core/provider"; import { tokenRefresh } from "../core/api/Login"; import { setCookie } from "../utils/cookie"; -import { SessionProvider } from "next-auth/react"; +import { getSession, SessionProvider } from "next-auth/react"; function MyApp({ + pageProps, my, uncheckedCnt, myChatRooms, newToken, Component, - pageProps, - // pageProps: { session, ...pageProps }, }) { const [loading, setLoading] = useState(false); axios.defaults.baseURL = process.env.NEXT_PUBLIC_API_URL; @@ -67,65 +66,65 @@ function MyApp({ - - + {/* - {/* {session !== undefined ? ( - - - - ) : ( */} - - {/* )} */} - + > */} + + {/* */} ); } -MyApp.getInitialProps = async (context) => { - let myTokens = { - access: "", - refresh: "", - role: "", - }; - - let parsed = ""; - let newToken = ""; +export async function getServerSideProps(context) { + // let myTokens = { + // access: "", + // refresh: "", + // role: "", + // }; - if (context.ctx.req && context.ctx.req.headers.cookie) { - // console.log("this is req===", context.ctx.req); - // if(context.ctx.req.statusCode==401 && message=="TOKENEXPIRED"){ - // tokenRefresh(); - // } - const parsedCookie = cookie.parse(context.ctx.req.headers.cookie); - parsed = parsedCookie; - myTokens.access = parsedCookie.accessToken; - myTokens.refresh = parsedCookie.refreshToken; - myTokens.role = parsedCookie.role; - const res = await tokenRefresh( - myTokens.access, - myTokens.refresh, - myTokens.role - ); - newToken = - res?.headers["x-access-token"] !== undefined - ? res.headers["x-access-token"] - : myTokens.access; - } + // let parsed = ""; + // let newToken = ""; - axios.defaults.headers.common["Authorization"] = myTokens.access; - axios.defaults.headers.common["Set-Cookie"] = JSON.stringify(myTokens); - myAxios.defaults.headers.common["Authorization"] = myTokens.access; - myAxios.defaults.headers.common["Set-Cookie"] = JSON.stringify(myTokens); + // if (context.ctx.req && context.ctx.req.headers.cookie) { + // // console.log("this is req===", context.ctx.req); + // // if(context.ctx.req.statusCode==401 && message=="TOKENEXPIRED"){ + // // tokenRefresh(); + // // } + // const parsedCookie = cookie.parse(context.ctx.req.headers.cookie); + // parsed = parsedCookie; + // myTokens.access = parsedCookie.accessToken; + // myTokens.refresh = parsedCookie.refreshToken; + // myTokens.role = parsedCookie.role; + // const res = await tokenRefresh( + // myTokens.access, + // myTokens.refresh, + // myTokens.role + // ); + // newToken = + // res?.headers["x-access-token"] !== undefined + // ? res.headers["x-access-token"] + // : myTokens.access; + // } - const my = await getMyInfo(myTokens.access); - const uncheckedCnt = await getUncheckedNotificationCount(myTokens.access); - const myChatRooms = await allChatRooms(); - return { my, uncheckedCnt, myChatRooms, newToken }; -}; + // axios.defaults.headers.common["Authorization"] = myTokens.access; + // axios.defaults.headers.common["Set-Cookie"] = JSON.stringify(myTokens); + // myAxios.defaults.headers.common["Authorization"] = myTokens.access; + // myAxios.defaults.headers.common["Set-Cookie"] = JSON.stringify(myTokens); + // console.log(context); + // const my = await getMyInfo(); + // const uncheckedCnt = await getUncheckedNotificationCount(); + // const myChatRooms = await allChatRooms(); + return { + // my, + // uncheckedCnt, + // myChatRooms, + // newToken, + session: await getSession(context), + }; +} export default wrapper.withRedux(MyApp); diff --git a/pages/api/auth/[...nextauth].jsx b/pages/api/auth/[...nextauth].jsx index 592ea04..fcf8a43 100644 --- a/pages/api/auth/[...nextauth].jsx +++ b/pages/api/auth/[...nextauth].jsx @@ -1,8 +1,11 @@ +import axios from "axios"; import NextAuth from "next-auth"; import CredentialProvider from "next-auth/providers/credentials"; +import myAxios from "../../../core/api/apiController"; + import { login } from "../../../core/api/Login"; -// async function refreshAccessToken(access, refresh) { +// async function refreshAccessToken(tokenObjecth) { // try { // const url = "http://3.37.39.47:8080/refresh-token"; // const response = await fetch(url, { @@ -36,56 +39,176 @@ import { login } from "../../../core/api/Login"; // } // } -export default NextAuth({ - providers: [ - CredentialProvider({ - id: "email-password-credential", - name: "credentials", - credentials: { - username: { label: "Email", type: "email" }, - password: { - label: "Password", - type: "password", - }, +// async function refreshAccessToken(tokenObject) { +// try { +// // Get a new set of tokens with a refreshToken +// const tokenResponse = await axios.post(YOUR_API_URL + "auth/refreshToken", { +// token: tokenObject.refreshToken, +// }); + +// return { +// ...tokenObject, +// accessToken: tokenResponse.data.accessToken, +// accessTokenExpiry: tokenResponse.data.accessTokenExpiry, +// refreshToken: tokenResponse.data.refreshToken, +// }; +// } catch (error) { +// return { +// ...tokenObject, +// error: "RefreshAccessTokenError", +// }; +// } +// } + +// export default NextAuth({ +// session: { +// jwt: true, +// maxAge: 30 * 24 * 60 * 60, +// }, +// providers: [ +// CredentialProvider({ +// id: "email-password-credential", +// name: "credentials", +// credentials: { +// username: { label: "Email", type: "email" }, +// password: { +// label: "Password", +// type: "password", +// }, +// }, + +// async authorize(credentials, req) { +// const res = await login(credentials.username, credentials.password); +// console.log("res===", res); +// if (res?.status == 200) { +// return { +// id: 1, +// name: "Hi", +// email: "hkhk", +// accessToken: res.headers["x-access-token"], +// refreshToken: res.headers["x-refresh-token"], +// role: "MENTOR", +// }; +// } else { +// return null; +// } +// }, +// }), +// ], +// secret: process.env.SECRET, +// callbacks: { +// async jwt({ token, user, account }) { +// console.log("user=", user); +// console.log("acc=", account); +// console.log("username ====", user); +// if (typeof user !== typeof undefined) { +// console.log("valid user!"); +// // token.access = user.accessToken; +// // token.refresh = user.refreshToken; +// // token.role = user.role; +// token.user = user; +// } else { +// console.log("invalid user!"); +// } +// return token; +// }, +// async session({ session, token }) { +// console.log("session===", session); +// if (session !== null) { +// // session.access = token.access; +// // session.refresh = token.refresh; +// // session.role = token.role; +// session.user = token; +// } else if ( +// typeof token.user !== typeof undefined && +// (typeof session.user === typeof undefined || +// (typeof session.user !== typeof undefined && +// typeof session.user.userId === typeof undefined)) +// ) { +// session.user = token.user; +// } else if (typeof token !== typeof undefined) { +// session.token = token; +// } +// return session; +// }, +// }, +// pages: { signIn: "/common/auth/login" }, +// }); + +const providers = [ + CredentialProvider({ + name: "Credentials", + id: "email-password-credential", + credentials: { + username: { label: "Email", type: "email" }, + password: { + label: "Password", + type: "password", }, - async authorize(credentials, req) { - const res = await login(credentials.username, credentials.password); - console.log("res===", res); - if (res?.status == 200) { - return { - accessToken: res.headers["x-access-token"], - refreshToken: res.headers["x-refresh-token"], - role: "MENTOR", - }; - } else { - return ""; + }, + + authorize: async (credentials) => { + try { + // Authenticate user with credentials + // const user = await axios.post(YOUR_API_URL + "auth/login", { + // password: credentials.password, + // email: credentials.email, + // }); + const user = await login(credentials.username, credentials.password); + console.log(credentials); + if (user.data.accessToken) { + return user.data; } - }, - }), - ], - callbacks: { - async jwt({ token, user, account }) { - console.log("user=", user); - console.log("acc=", account); - if (user) { - console.log("valid user!"); - token.access = user.accessToken; - token.refresh = user.refreshToken; - token.role = user.role; - } else { - console.log("invalid user!"); + + return null; + } catch (e) { + throw new Error(e); } - return token; - }, - async session({ session, token }) { - console.log("session===", session); - // if (token) { - // session.access = token.access; - // session.refresh = token.refresh; - // session.role = token.role; - // } - return session; }, + }), +]; + +const callbacks = { + jwt: async ({ token, user }) => { + console.log("user == ", user); + console.log("token ====", token); + if (user) { + // This will only be executed at login. Each next invocation will skip this part. + token.accessToken = user.accessToken; + token.accessTokenExpiry = user.accessTokenExpiry; + token.refreshToken = user.refreshToken; + } + + // If accessTokenExpiry is 24 hours, we have to refresh token before 24 hours pass. + const shouldRefreshTime = Math.round( + token.accessTokenExpiry - 60 * 60 * 1000 - Date.now() + ); + + // If the token is still valid, just return it. + if (shouldRefreshTime > 0) { + return Promise.resolve(token); + } + + // If the call arrives after 23 hours have passed, we allow to refresh the token. + // token = refreshAccessToken(token); + return Promise.resolve(token); }, + session: async ({ session, token }) => { + axios.defaults.headers.common.Authorization = `${token.accessToken}`; + session.accessToken = token.accessToken; + session.accessTokenExpiry = token.accessTokenExpiry; + session.error = token.error; + + return Promise.resolve(session); + }, +}; + +export const options = { + providers, + callbacks, pages: { signIn: "/common/auth/login" }, -}); + secret: process.env.SECRET, +}; + +const Auth = (req, res) => NextAuth(req, res, options); +export default Auth; diff --git a/pages/common/auth/login.jsx b/pages/common/auth/login.jsx index 1c1038f..db088c2 100644 --- a/pages/common/auth/login.jsx +++ b/pages/common/auth/login.jsx @@ -11,7 +11,7 @@ import { login, getUserRoleType } from "../../../core/api/Login"; import { cookieForAuth, removeInfo } from "../../../utils/cookie"; import { IC_Google, IC_Kakao, IC_Logo, IC_Naver } from "../../../icons"; import { NameLogo } from "../../../components/common/icons/nameLogo"; -import { signIn } from "next-auth/react"; +import { signIn, useSession } from "next-auth/react"; const Login = () => { const [username, setUsername] = useState(""); @@ -31,18 +31,18 @@ const Login = () => { console.log("response=", response); // const res = await login(username, password); - // if (res.status == 200) { - // const role = await getUserRoleType(res.headers["x-access-token"]); - // cookieForAuth(res, role); - // // if (role.loginType === "ROLE_MENTOR") { - // // router.push("/mentor/myclass/myClassList"); - // // } - // // if (role.loginType === "ROLE_MENTEE") { - // // router.push("/mentee"); - // // } - // } else { - // setError(true); - // } + if (response.status == 200) { + // const role = await getUserRoleType(response.headers["x-access-token"]); + // cookieForAuth(res, role); + // if (role.loginType === "ROLE_MENTOR") { + // router.push("/mentor/myclass/myClassList"); + // } + // if (role.loginType === "ROLE_MENTEE") { + router.push("/mentee"); + // } + } else { + setError(true); + } }; const onChangeUsername = (e) => { diff --git a/pages/mentee/index.jsx b/pages/mentee/index.jsx index 29b70db..c992a87 100644 --- a/pages/mentee/index.jsx +++ b/pages/mentee/index.jsx @@ -19,6 +19,7 @@ import Chip from "@mui/material/Chip"; import { getLecture } from "../../core/api/Mentee"; import { getUserRoleType } from "../../core/api/Login"; import { useDebounceEffect } from "./board"; +import { getSession } from "next-auth/react"; const filters = ["개발 분야", "수업 방식", "레벨"]; const subjectsList = [ @@ -68,7 +69,7 @@ const Home = ({ classes, role, token, user }) => { const [difficultyType, setDifficultyType] = useState(["전체"]); const [isVisible, setIsVisible] = useState(false); const [value, setValue] = useState("1"); - + console.log("test", classes); // 필터 컨버팅 const difficult = difficultyType.map((el) => converDifficulty(el)); const group = isGroup.map((el) => convertGroup(el)); @@ -104,7 +105,7 @@ const Home = ({ classes, role, token, user }) => { if (Math.round(scrollTop + innerHeight) >= scrollHeight) { setPage(page + 1); - const showMore = await getLecture(token, { + const showMore = await getLecture({ difficultyTypes: difficult, isGroup: group, page: page + 1, @@ -134,7 +135,7 @@ const Home = ({ classes, role, token, user }) => { systemType: type, title: search, }; - const newLecture = await getLecture(token, data); + const newLecture = await getLecture(data); setClassData(newLecture.content); setIsVisible(false); setPage(1); @@ -150,25 +151,26 @@ const Home = ({ classes, role, token, user }) => { const data = { page: 1, }; - const newLecture = await getLecture(token, data); + const newLecture = await getLecture(data); setClassData(newLecture.content); }; - const debounceSearch = async () => { - const data = { - difficultyTypes: difficult, - isGroup: group, - page: 1, - subjects: subjects.filter((el) => el !== "전체"), - systemType: type, - title: search, - }; - const newLecture = await getLecture(token, data); - setClassData(newLecture.content); - setPage(1); - }; + // const debounceSearch = async () => { + // const data = { + // difficultyTypes: difficult, + // isGroup: group, + // page: 1, + // subjects: subjects.filter((el) => el !== "전체"), + // systemType: type, + // title: search, + // }; + // const newLecture = await getLecture(data); + // console.log(newLecture); + // setClassData(newLecture.content); + // setPage(1); + // }; - useDebounceEffect(() => debounceSearch(), 500, [search]); + // useDebounceEffect(() => debounceSearch(), 500, [search]); const handleChange = (event, newValue) => { setValue(newValue); @@ -379,16 +381,17 @@ const Home = ({ classes, role, token, user }) => { }; export const getServerSideProps = async (context) => { - const parsedCookies = cookie.parse(context.req.headers.cookie); - const role = parsedCookies.role; - const classes = await getLecture(parsedCookies.accessToken, { page: 1 }); - const user = await getUserRoleType(parsedCookies.accessToken); + // const parsedCookies = cookie.parse(context.req.headers.cookie); + // const role = parsedCookies.role; + const classes = await getLecture({ page: 1 }); + const user = await getUserRoleType(); + const token = await getSession(context); return { props: { classes: classes, - role, - token: parsedCookies.accessToken, + role: "MENTEE", + token: token, user, }, }; From df6501f5e518b2e13afaca3235d452bc9bc99b84 Mon Sep 17 00:00:00 2001 From: Jetom88 Date: Wed, 13 Jul 2022 20:02:23 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Feat:=20=EC=86=8C?= =?UTF-8?q?=EC=85=9C=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EA=B5=AC=ED=98=84(?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/api/auth/[...nextauth].jsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pages/api/auth/[...nextauth].jsx b/pages/api/auth/[...nextauth].jsx index fcf8a43..6a9d834 100644 --- a/pages/api/auth/[...nextauth].jsx +++ b/pages/api/auth/[...nextauth].jsx @@ -2,6 +2,8 @@ import axios from "axios"; import NextAuth from "next-auth"; import CredentialProvider from "next-auth/providers/credentials"; import myAxios from "../../../core/api/apiController"; +import GoogleProvider from "next-auth/providers/google"; +import NaverProvider from "next-auth/providers/naver"; import { login } from "../../../core/api/Login"; @@ -166,6 +168,16 @@ const providers = [ } }, }), + + GoogleProvider({ + clientId: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + }), + + NaverProvider({ + clientId: process.env.NAVER_CLIENT_ID, + clientSecret: process.env.NAVER_CLIENT_SECRET, + }), ]; const callbacks = {