From 9123b92e9262bae61f312d0af257eca25f49dc56 Mon Sep 17 00:00:00 2001 From: shinmj Date: Wed, 29 Dec 2021 14:00:24 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20frontend=20custom=20server=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C,=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/user/dto/UserJoinRequestDto.java | 6 +++ .../userservice/service/user/UserService.java | 3 +- frontend/portal/next.config.js | 2 + frontend/portal/package-lock.json | 46 ++++++++++++------- frontend/portal/package.json | 27 ++++++----- frontend/portal/server/index.ts | 31 ------------- frontend/portal/src/constants/env.ts | 4 +- frontend/portal/src/pages/auth/join/form.tsx | 13 ++++-- .../portal/src/pages/auth/login/index.tsx | 45 +++++++++++++----- frontend/portal/tsconfig.server.json | 10 ---- 10 files changed, 97 insertions(+), 90 deletions(-) delete mode 100644 frontend/portal/server/index.ts delete mode 100644 frontend/portal/tsconfig.server.json diff --git a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/UserJoinRequestDto.java b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/UserJoinRequestDto.java index e68703a..94e117f 100644 --- a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/UserJoinRequestDto.java +++ b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/UserJoinRequestDto.java @@ -1,5 +1,6 @@ package org.egovframe.cloud.userservice.api.user.dto; +import java.util.Objects; import lombok.Getter; import lombok.NoArgsConstructor; import org.egovframe.cloud.common.domain.Role; @@ -64,6 +65,11 @@ public class UserJoinRequestDto { */ private String token; + public Boolean isProvider() { + return Objects.nonNull(provider) && !"".equals(provider) & !"undefined".equals(provider) + && Objects.nonNull(token) && !"".equals(token) && !"undefined".equals(token); + } + /** * UserSaveRequestDto 의 필드 값을 User Entity 빌더를 사용하여 주입 후 User를 리턴한다. * UserSaveRequestDto 가 가지고 있는 User 의 필드만 세팅할 수 있게 된다. diff --git a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/service/user/UserService.java b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/service/user/UserService.java index cfd1a01..3f5c8d6 100644 --- a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/service/user/UserService.java +++ b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/service/user/UserService.java @@ -319,7 +319,7 @@ public class UserService extends AbstractService implements UserDetailsService { User user = requestDto.toEntity(passwordEncoder); - if (requestDto.getProvider() != null && !"".equals(requestDto.getProvider()) && requestDto.getToken() != null && !"".equals(requestDto.getToken())) { + if (requestDto.isProvider()) { SocialUserResponseDto socialUserResponseDto = getSocialUserInfo(requestDto.getProvider(), requestDto.getToken()); user.setSocial(requestDto.getProvider(), socialUserResponseDto.getId()); } @@ -329,6 +329,7 @@ public class UserService extends AbstractService implements UserDetailsService { return true; } + /** * 사용자 비밀번호 찾기 * diff --git a/frontend/portal/next.config.js b/frontend/portal/next.config.js index aa1d48a..e155860 100644 --- a/frontend/portal/next.config.js +++ b/frontend/portal/next.config.js @@ -5,6 +5,7 @@ const port = process.env.PORT || 3000 const serverApiUrl = process.env.SERVER_API_URL || 'http://localhost:8000' const siteId = process.env.SITE_ID || '3' const mode = siteId === '2' ? 'lg' : siteId === '3' ? 'sm' : 'sm' +const socialLoginEnabled = process.env.SOCIAL_LOGIN_ENABLED || 'false' module.exports = { i18n, @@ -14,6 +15,7 @@ module.exports = { MODE: mode, SERVER_API_URL: serverApiUrl, SITE_ID: siteId, + SOCIAL_LOGIN_ENABLED: socialLoginEnabled, }, async rewrites() { return [ diff --git a/frontend/portal/package-lock.json b/frontend/portal/package-lock.json index 1b16036..cab06d9 100644 --- a/frontend/portal/package-lock.json +++ b/frontend/portal/package-lock.json @@ -17,6 +17,7 @@ "axios": "^0.21.1", "cookies": "^0.8.0", "cors": "^2.8.5", + "cross-env": "^7.0.3", "date-fns": "^2.23.0", "date-fns-tz": "^1.1.6", "eventsource": "^1.1.0", @@ -4230,11 +4231,27 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6973,8 +6990,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/istanbul-lib-coverage": { "version": "3.0.0", @@ -10182,7 +10198,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -11269,7 +11284,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -11281,7 +11295,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -12566,7 +12579,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -15965,11 +15977,18 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "requires": { + "cross-spawn": "^7.0.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -18023,8 +18042,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "istanbul-lib-coverage": { "version": "3.0.0", @@ -20488,8 +20506,7 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -21311,7 +21328,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -21319,8 +21335,7 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shell-quote": { "version": "1.7.2", @@ -22334,7 +22349,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/frontend/portal/package.json b/frontend/portal/package.json index 1200bbc..5c2690d 100644 --- a/frontend/portal/package.json +++ b/frontend/portal/package.json @@ -7,24 +7,22 @@ "npm": "6.14.7" }, "scripts": { - "dev": "ts-node --project tsconfig.server.json server/index.ts", + "dev": "cross-env next dev -p ${PORT-3000}", "dev:sm": "SITE_ID=3 npm run dev", "dev:lg": "SITE_ID=2 npm run dev", "dev:smWin": "set SITE_ID=3&&npm run dev", "dev:lgWin": "set SITE_ID=2&&npm run dev", - "build:server": "tsc --project tsconfig.server.json", - "build:next": "next build", - "prebuild": "rimraf ./build", - "build": "NODE_ENV=production npm run build:next && npm run build:server", - "build:prodlg": "env-cmd -f ./.env.production-lg npm run build:next && npm run build:server", - "start:prodlg": "env-cmd -f ./.env.production-lg node build/index.js", - "build:prodsm": "env-cmd -f ./.env.production-sm npm run build:next && npm run build:server", - "start:prodsm": "env-cmd -f ./.env.production-sm node build/index.js", - "build:prodk8slg": "env-cmd -f ./.env.production-k8s-lg npm run build:next && npm run build:server", - "start:prodk8slg": "env-cmd -f ./.env.production-k8s-lg node build/index.js", - "build:prodk8ssm": "env-cmd -f ./.env.production-k8s-sm npm run build:next && npm run build:server", - "start:prodk8ssm": "env-cmd -f ./.env.production-k8s-sm node build/index.js", - "start": "NODE_ENV=production node build/index.js", + "build": "NODE_ENV=production next build", + "prebuild": "rimraf ./next", + "build:prodlg": "env-cmd -f ./.env.production-lg npm run build", + "start:prodlg": "env-cmd -f ./.env.production-lg npm run start", + "build:prodsm": "env-cmd -f ./.env.production-sm npm run build", + "start:prodsm": "env-cmd -f ./.env.production-sm npm run start", + "build:prodk8slg": "env-cmd -f ./.env.production-k8s-lg npm run build", + "start:prodk8slg": "env-cmd -f ./.env.production-k8s-lg npm run start", + "build:prodk8ssm": "env-cmd -f ./.env.production-k8s-sm npm run build", + "start:prodk8ssm": "env-cmd -f ./.env.production-k8s-sm npm run start", + "start": "NODE_ENV=production next start", "test": "jest --coverage" }, "dependencies": { @@ -37,6 +35,7 @@ "axios": "^0.21.1", "cookies": "^0.8.0", "cors": "^2.8.5", + "cross-env": "^7.0.3", "date-fns": "^2.23.0", "date-fns-tz": "^1.1.6", "eventsource": "^1.1.0", diff --git a/frontend/portal/server/index.ts b/frontend/portal/server/index.ts deleted file mode 100644 index 2ed9883..0000000 --- a/frontend/portal/server/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { loadEnvConfig } from '@next/env' -import cors from 'cors' -import express, { Request, Response } from 'express' -import next from 'next' -loadEnvConfig('./', process.env.NODE_ENV !== 'production') - -const port = process.env.PORT || 3000 -const dev = process.env.NODE_ENV !== 'production' -const app = next({ dev }) -const handle = app.getRequestHandler() - -const startServer = async () => { - try { - await app.prepare() - const server = express() - server.use(cors()) - server.all('*', (req: Request, res: Response) => { - return handle(req, res) - }) - - server.listen(port, (err?: any) => { - if (err) throw err - console.info(`> Ready on localhost:${port} - env ${process.env.NODE_ENV}`) - }) - } catch (error) { - console.error(error) - process.exit(1) - } -} - -startServer() diff --git a/frontend/portal/src/constants/env.ts b/frontend/portal/src/constants/env.ts index 338a5d4..4f2397a 100644 --- a/frontend/portal/src/constants/env.ts +++ b/frontend/portal/src/constants/env.ts @@ -20,4 +20,6 @@ export const SITE_ID = process.env.SITE_ID export const GOOGLE_CLIENT_ID = process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID export const KAKAO_JAVASCRIPT_KEY = process.env.NEXT_PUBLIC_KAKAO_JAVASCRIPT_KEY export const NAVER_CLIENT_ID = process.env.NEXT_PUBLIC_NAVER_CLIENT_ID -export const NAVER_CALLBACK_URL = process.env.NEXT_PUBLIC_NAVER_CALLBACK_URL \ No newline at end of file +export const NAVER_CALLBACK_URL = process.env.NEXT_PUBLIC_NAVER_CALLBACK_URL + +export const SOCIAL_LOGIN_ENABLED = process.env.SOCIAL_LOGIN_ENABLED diff --git a/frontend/portal/src/pages/auth/join/form.tsx b/frontend/portal/src/pages/auth/join/form.tsx index 05034bb..940bbe3 100644 --- a/frontend/portal/src/pages/auth/join/form.tsx +++ b/frontend/portal/src/pages/auth/join/form.tsx @@ -4,11 +4,11 @@ import { makeStyles, Theme } from '@material-ui/core/styles' import Alert from '@material-ui/lab/Alert' import { ISocialUser, userService } from '@service' import { format, isValidPassword } from '@utils' +import { GetServerSideProps } from 'next' import { useRouter } from 'next/router' import React, { createRef, useEffect, useState } from 'react' import { Controller, useForm } from 'react-hook-form' import { useTranslation } from 'react-i18next' -import { GetServerSideProps } from 'next' const useStyles = makeStyles((theme: Theme) => ({ alert: { @@ -81,7 +81,6 @@ const Form = (props: FormProps) => { useEffect(() => { if (socialUser) { if (socialUser.name) { - } } }, [socialUser]) @@ -175,7 +174,9 @@ const Form = (props: FormProps) => { { > { return { props: { - socialUser + socialUser, }, } } diff --git a/frontend/portal/src/pages/auth/login/index.tsx b/frontend/portal/src/pages/auth/login/index.tsx index c02809a..3e08b95 100644 --- a/frontend/portal/src/pages/auth/login/index.tsx +++ b/frontend/portal/src/pages/auth/login/index.tsx @@ -5,7 +5,14 @@ import { KakaoLoginButton, NaverLoginButton, } from '@components/Buttons' +import CustomConfirm, { CustomConfirmPrpps } from '@components/CustomConfirm' import Loader from '@components/Loader' +import { + GOOGLE_CLIENT_ID, + KAKAO_JAVASCRIPT_KEY, + NAVER_CLIENT_ID, + SOCIAL_LOGIN_ENABLED, +} from '@constants/env' import useUser from '@hooks/useUser' import { ILogin, loginSerivce } from '@service' import { userAtom } from '@stores' @@ -13,7 +20,6 @@ import Router, { useRouter } from 'next/router' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useRecoilValue } from 'recoil' -import CustomConfirm, { CustomConfirmPrpps } from '@components/CustomConfirm' interface AlertProps extends CustomConfirmPrpps { message: string @@ -62,7 +68,9 @@ const Login = () => { }) // recoil 쓰려했는데 회원가입에 스탭이 있어서 진행중에 새로고침하면 상태가 삭제되면서 일반회원으로 가입될 수 있어서 소셜 정보를 파라미터로 넘김 - router.push(`/auth/join?provider=${data.provider}&token=${data.token}`) + router.push( + `/auth/join?provider=${data.provider}&token=${data.token}`, + ) }, handleCancel: () => { if (data.provider === 'kakao') { @@ -131,16 +139,29 @@ const Login = () => { {t('login.password_find')} -
-

- {t('label.title.login.oauth')} -

-
- - - -
-
+ {/** 소셜 로그인을 사용하는 경우 enabled 됨. */} + {SOCIAL_LOGIN_ENABLED === 'true' && ( +
+

+ {t('label.title.login.oauth')} +

+
+ {KAKAO_JAVASCRIPT_KEY && ( + + )} + {NAVER_CLIENT_ID && ( + + )} + {GOOGLE_CLIENT_ID && ( + + )} +
+
+ )} {customConfirm && (