From 80e2e4e8b3f37f6c5623da6d1eedd781120ca348 Mon Sep 17 00:00:00 2001 From: jooho Date: Tue, 26 Oct 2021 09:42:40 +0900 Subject: [PATCH] update --- .../api/user/dto/SocialUserRequestDto.java | 36 +++++++++++ .../api/user/dto/SocialUserResponseDto.java | 58 ++++++++++++++++++ frontend/portal/public/locales/ko/common.json | 2 +- frontend/portal/src/components/App/index.tsx | 3 +- .../components/Buttons/KakaoLoginButton.tsx | 29 ++++++++- .../components/Buttons/NaverLoginButton.tsx | 37 ++++++------ .../portal/src/pages/api/login/[...path].ts | 2 +- frontend/portal/src/pages/auth/join/form.tsx | 60 +++++++++++++++++-- frontend/portal/src/pages/auth/join/index.tsx | 2 +- .../portal/src/pages/auth/login/index.tsx | 45 +++++++++++++- .../portal/src/pages/auth/login/naver.tsx | 2 +- frontend/portal/src/pages/user/info/index.tsx | 9 +-- frontend/portal/src/service/Login.ts | 2 + frontend/portal/src/service/User.ts | 9 +++ 14 files changed, 256 insertions(+), 40 deletions(-) create mode 100644 backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/SocialUserRequestDto.java create mode 100644 backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/SocialUserResponseDto.java diff --git a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/SocialUserRequestDto.java b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/SocialUserRequestDto.java new file mode 100644 index 0000000..399d045 --- /dev/null +++ b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/SocialUserRequestDto.java @@ -0,0 +1,36 @@ +package org.egovframe.cloud.userservice.api.user.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * org.egovframe.cloud.userservice.api.user.dto.SocialUserRequestDto + * + * 소셜 사용자 요청 DTO 클래스 + * + * @author 표준프레임워크센터 jooho + * @version 1.0 + * @since 2021/10/22 + * + *
+ * << 개정이력(Modification Information) >>
+ *
+ *    수정일       수정자              수정내용
+ *  ----------    --------    ---------------------------
+ *  2021/10/22    jooho       최초 생성
+ * 
+ */ +@Getter +@NoArgsConstructor +public class SocialUserRequestDto { + + /** + * 공급자 + */ + private String provider; + + /** + * 토큰 + */ + private String token; +} diff --git a/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/SocialUserResponseDto.java b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/SocialUserResponseDto.java new file mode 100644 index 0000000..312c1ff --- /dev/null +++ b/backend/user-service/src/main/java/org/egovframe/cloud/userservice/api/user/dto/SocialUserResponseDto.java @@ -0,0 +1,58 @@ +package org.egovframe.cloud.userservice.api.user.dto; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * org.egovframe.cloud.userservice.api.user.dto.SocialUserResponseDto + *

+ * 소셜 사용자 응답 DTO 클래스 + * + * @author 표준프레임워크센터 jooho + * @version 1.0 + * @since 2021/10/22 + * + *

+ * << 개정이력(Modification Information) >>
+ *
+ *    수정일       수정자              수정내용
+ *  ----------    --------    ---------------------------
+ *  2021/10/22    jooho       최초 생성
+ * 
+ */ +@Getter +@NoArgsConstructor +public class SocialUserResponseDto { + + /** + * 아이디 + */ + private String id; + + /** + * 이메일 + */ + private String email; + + /** + * 이름 + */ + private String name; + + /** + * 소셜 사용자 DTO 클래스 생성자 + * 빌더 패턴으로 객체 생성 + * + * @param id 아이디 + * @param email 이메일 + * @param name 이름 + */ + @Builder + public SocialUserResponseDto(String id, String email, String name) { + this.id = id; + this.email = email; + this.name = name; + } + +} diff --git a/frontend/portal/public/locales/ko/common.json b/frontend/portal/public/locales/ko/common.json index 48b0869..5385c57 100644 --- a/frontend/portal/public/locales/ko/common.json +++ b/frontend/portal/public/locales/ko/common.json @@ -1 +1 @@ -{"role_authorization":"권한 인가","common.use_at":"사용 여부","common.free":"무료","common.delete.creator":"작성자에 의해 삭제된 댓글입니다.","label.button.close":"닫기","err.invalid.input.value":"입력값이 올바르지 않습니다","reserve_item.operation":"운영","label.text.leave.complete1":"정상적으로 탈퇴 처리 되었습니다.","label.text.leave.complete2":"그동안 이용해주셔서 감사합니다.","label.title.home":"홈","menu.eng_name":"영문 메뉴명","reserve_item.is_possible":"예약 가능 여부","label.button.all_checked":"전체체크","menu.no":"메뉴 번호","common.address":"주소","reserve.msg.calcel_reason":"취소 사유를 입력하세요.","label.text.modified_password":"비밀번호가 정상적으로 변경되었습니다.\n변경된 비밀번호는 다음 로그인시부터 적용됩니다.","file.msg_limit.format":"파일은 최대 {0}까지 업로드할 수 있습니다.","common.search":"검색","board.comment_use_at":"댓글 사용 여부","label.title.required":"필수입력항목","role.role_content":"권한 내용","label.button.all_unchecked":"전체해제","menu.type":"메뉴 유형","common.created_date":"등록일","label.title.change_password":"비밀번호 변경","valid.format_not_match":"형식이 맞지 않습니다.","role.information":"권한 정보","valid.reserve_not_update":"해당 예약은 수정할 수 없습니다.","board.upload_use_at":"업로드 사용 여부","label.button.reply":"답글 작성","menu.all_expand":"전체펼침","user.login.provider":"로그인 방법","menu.all_collapse":"전체접기","reserve_item.selection_means":"선별 방법","menu.self":"현재창","attachment.file_name":"파일명","reserve_item.request":"예약신청","reserve_item.impossible":"예약 불가","label.button.next":"다음","comment.comment_title":"제목","menu.site":"사이트","reserve.msg.find_item":"예약물품 검색을 이용하여 예약 신청하실 물품을 등록해주세요.","reserve_item.contact":"문의처","role.manage_authorization":"권한매핑관리","common.cancel":"취소","reserve.cancel_reason":"취소 사유","privacy.privacy_content":"개인정보처리방침 내용","role":"권한","common.approve":"승인","err.user.notexists":"회원이 존재하지 않습니다.","board.skin_type_code":"스킨 유형","valid.file.not_deleted":"파일을 삭제할 수 없습니다.","menu.show_at":"출력 여부","valid.to_be_fast.format":"{0}이 {1} 보다 빠릅니다.","login.email_save":"이메일 저장","user.user_state_code":"사용자 상태","err.user.social.cannotuse":"소셜 회원은 이용할 수 없습니다.","common.required_fields":"필수입력항목","msg.success.permanent_delete":"성공적으로 완전삭제되었습니다.","valid.cant_cancel":"해당 예약은 취소할 수 없습니다.","menu.blank":"새창","err.title":"시스템 오류","banner.banner_type_code":"배너 구분","common.target":"대상","label.text.password_format":"* 영문, 숫자, 특수기호가 포함된 8자~20자리","err.method.not.allowed":"해당 요청은 사용 불가능한 상태입니다","valid.file.not_saved_try_again":"파일을 저장할 수 없습니다. 다시 시도해 주세요.","policy":"이용약관","common.start_datetime":"시작일시","user.last_login_date":"최종 로그인 일시","attachment.download_count":"다운로드 수","email.user.password.title":"비밀번호 재설정을 위한 안내메일입니다.","common.url":"URL","board.new_display_day_count":"신규 표시 일 수","err.user.login.social":"소셜 로그인을 할 수 없습니다.","common.manage":"관리","reserve_item.reserve_method":"예약 방법","label.button.join":"가입","valid.password":"비밀번호는 영문 숫자 특수기호가 포함된 8자~20자리 이내로 입력해주세요.","common.written_by":"작성자","common.agree.n":"동의안함","err.access.denied":"해당 요청에 대한 접근이 거절되었습니다","menu.valid.delete":"삭제할 메뉴를 선택해 주세요.","label.button.permanent_delete":"완전 삭제","menu.outside_link_help":"외부 페이지링크는 http// 또는 https// 를 포함하여 입력해주시기 바랍니다.","statistics.daily":"일별","err.internal.server":"서버 오류가 발생했습니다","common.agree.y":"동의함","reserve_item.period_possible":"기간 지정 가능여부","err.entity.not.found":"해당 데이터가 존재하지 않습니다","code.code_description":"코드 설명","label.title.name":"이름","common.end_date":"종료일","common.paid":"유료","reserve.msg.complete":"정상적으로 예약신청이 완료되었습니다.","label.text.user.leave.password":"회원탈퇴를 하시려면 현재 비밀번호를 입력해주세요.","label.button.add":"추가","valid.reserve_count":"해당 날짜에 예약할 수 있는 재고수량이 없습니다.","menu.valid.change_name":"이름을 변경할 메뉴를 선택해 주세요.","label.title.oauth":"간편인증","valid.file.too_big":"파일 용량이 너무 큽니다.","common.noti":"알림","valid.reserve.number_of_people":"신청인원이 수용인원보다 많습니다.","code.code_id":"코드 ID","valid.minlength.format":"{0}자 이상으로 입력해주세요.","err.invalid.type.value":"타입이 올바르지 않습니다","common.basic":"기본","board.page_display_count":"페이지 표시 수","reserve_item.max_period_days":"최대 예약 가능 일수","msg.user.find.password":"회원님의 메일주소 {0}로\n비밀번호를 초기화하는 URL을 전송하였습니다.\n메일을 확인하여 비밀번호를 초기화한 후 로그인하세요.","msg.join.agree2":"개인정보수집에 동의해주세요.","banner.new_window_at":"새 창 여부","msg.join.agree1":"이용약관에 동의해주세요.","label.button.reg":"등록","authorization.url_pattern_value":"패턴","valid.user.password.notchange":"현재 비밀번호와 동일한 비밀번호 입니다.","err.duplicate.input.value":"중복된 값을 입력하였습니다","content.content_remark":"컨텐츠 설명","posts.prev_post":"이전글","posts.qna_content":"질문내용","msg.user.email.notexists":"사용 가능한 이메일입니다.","user.login_lock_at":"로그인 잠금 여부","reserve.phone":"휴대전화","common.status":"상태","label.button.selection_registration":"선택등록","valid.value_as_number":"숫자만 입력가능합니다.","label.title.login.oauth":"간편로그인","reserve_item.excluded":"사용허가 제외대상","common.modified_date":"수정 일시","label.button.save":"저장","err.posts.deleted":"삭제된 게시물입니다.","label.button.first":"처음으로","posts.qna_title":"질문제목","err.user.change.password":"인증시간이 만료되었습니다.\n처음부터 다시 진행해주시기 바랍니다.","valid.upload_limit_count.format":"파일은 최대 {0}개까지 업로드 가능합니다.","reserve_item.inventory":"재고(인원)","board.information":"게시판 정보","menu.connect_type":"연결 형태","content.content_value":"컨텐츠 내용","board.board_name":"게시판 명","role.role_id":"권한 id","valid.file.not_exists":"업로드할 파일이 없습니다.","reserve_item.external_url":"외부링크 URL","label.button.confirm":"확인","common.home_page_address":"홈페이지 주소","comment.comment_content":"내용","code.detail_count":"코드 상세수","common.read_count":"조회 수","privacy":"개인정보처리방침","code.detail.title":"공통코드상세관리","role.role_name":"권한 명","statistics.day":"일","content":"컨텐츠","reserve_item.type":"유형","label.button.leave":"탈퇴","board.post_display_count":"게시물 표시 수","reserve.status":"신청 상태","common.login":"로그인","statistics.monthly":"월별","reserve_item.add_information":"부가 정보","label.text.required.login":"회원님의 개인정보를 안전하게 보호하기 위해 인증 후 변경이 가능합니다.","reserve.period":"기간","board.editor_use_at":"에디터 사용 여부","posts.notexists.next":"다음글이 없습니다.","posts.board_no":"게시판 번호","code.title":"공통코드관리","label.text.user.leave.guide1":"회원탈퇴 후 입력하신 문의 및 게시물 등은 삭제되지 않으며, 회원정보 삭제로 인해 작성자 본인을 확인할 수 없어 편집 및 삭제 처리가 불가능합니다.","label.text.user.leave.guide2":"문의 및 게시물 삭제를 원하시는 경우에는 먼저 해당 게시물을 삭제하신 후 탈퇴를 신청하시기 바랍니다.","label.text.user.leave.guide3":"회원탈퇴 후 모든 개인정보는 개인정보 처리방침에 의거하여 삭제됩니다.","label.button.go_home":"처음으로","posts.next_post":"다음글","attachment.file_no":"파일 순번","label.button.find":"찾기","msg.success.restore":"성공적으로 복원되었습니다.","statistics.access":"접속 통계","label.button.delete":"삭제","location":"지역","label.text.kakao":"카카오","comment":"댓글","err.required.login":"로그인 후 다시 시도해주세요.","posts.notice_at":"공지 여부","label.title.current_password":"현재 비밀번호","common.delete.manager":"관리자에 의해 삭제된 댓글입니다.","reserve_titem.msg.help_period":"기간 지정 신청인 경우 1일 기준","common.provider":"공급자","err.user.join.social":"소셜 회원 가입 처리 중 예기치 않은 예외가 발생했습니다.","posts.posts_answer_content":"답변","location.name":"지역 명","common.notice":"공지","authorization":"인가","menu.description":"메뉴 설명","authorization.authorization_no":"인가 번호","valid.selection.already_restored.format":"선택한 정보는 이미 모두 복원되어 있습니다.","valid.password.confirm":"비밀번호가 일치하지 않습니다.","file.search":"파일찾기","common.contact":"연락처","authorization.http_method_code":"Http Method","label.title.password_confirm":"비밀번호 확인","reserve_item.purpose":"용도","board.board_no":"게시판 번호","msg.inventory_failed":"재고 업데이트에 실패했습니다.","msg.confirm.permanent_delete":"완전히 삭제하시겠습니까?","valid.manager_approve":"관리자만 승인할 수 있습니다.","posts.see_more":"더보기","common.read":"조회","valid.file.invalid_name":"파일명이 잘못되었습니다.","user.password":"비밀번호","valid.maxlength.format":"{0}자 이하로 입력해주세요.","posts.information":"게시물 정보","board.user_write_at":"사용자 작성 여부","menu.info_title":"메뉴 기본 설정","label.button.comment":"답글","reserve.msg.possible_count":"신청기간내 예약가능 수량","msg.success.save":"성공적으로 저장되었습니다.","reserve.count":"수량","label.button.selection_delete":"선택삭제","common.msg.done.format":"이(가) 완료되었습니다.","code.manage":"코드 관리","board.title_display_length":"제목 표시 길이","valid.cant_cancel_because_done":"해당 예약은 이미 실행되어 취소할 수 없습니다.","privacy.information":"개인정보처리방침 정보","label.button.edit":"수정","valid.value_as_date":"날짜 형식으로 입력해주세요.","statistics.year":"년","err.unauthorized":"권한이 불충분합니다","err.board.not_use_comment":"댓글 사용이 금지된 게시판입니다.","user.email":"이메일","common.logout":"로그아웃","code.code":"코드","reserve_item.possible":"예약 가능","common.created_by":"등록자","menu.new_menu":"새 메뉴","err.user.social.get":"공급사에서 회원 정보를 확인할 수 없습니다.","posts.posts_title":"제목","reserve_item.target":"이용 대상","label.button.change_password":"비밀번호 변경","board.upload_limit_size":"업로드 제한 크기(byte)","msg.confirm.registration":"등록하시겠습니까?","banner.banner_content":"배너 내용","valid.reserve_number_of_people":"예약가능한 인원이 부족합니다. (남은 인원 : {0})","label.text.user.password.modified":"비밀번호가 정상적으로 변경되었습니다.","common.created_at":"등록 여부","reserve_item.name":"예약 물품 명","err.page.not.found":"해당 페이지를 찾을 수 없습니다","common.search_word":"검색어","valid.between.format":"{0} ~ {1} 사이의 값을 입력해주세요.","content.content_name":"컨텐츠 명","valid.reserve_not_update_status":"예약 신청 상태인 경우에만 수정 가능합니다.","msg.confirm.leave":"탈퇴하시겠습니까?","common.sort_seq":"정렬 순서","common.end_datetime":"종료일시","label.button.selection_permanent_delete":"선택완전삭제","reserve.user":"예약자","menu":"메뉴","label.title.agree2":"개인정보수집동의","label.title.find_password":"비밀번호 찾기","label.title.agree1":"이용약관","label.title.leave":"회원탈퇴","err.unprocessable.entity":"처리할 수 없는 값입니다","label.button.asc":"등록순","common.start_date":"시작일","code.edit":"공통코드편집","statistics.month":"월","policy.title":"약관제목","label.title.guide":"안내사항","posts.attachment_code":"첨부파일 코드","err.user.socail.find":"소셜 회원 정보를 조회하지 못했습니다.","valid.selection.format":"{0}을(를) 선택해주세요.","msg.confirm.delete":"삭제하시겠습니까?","authorization.authorization_name":"인가 명","valid.to_be_slow.format":"{0}이 {1} 보다 늦습니다.","label.button.deselect":"선택해제","err.user.social.notmatch":"소셜 정보와 회원 정보가 일치하지 않습니다.","label.text.user.info.modified":"회원정보가 정상적으로 변경되었습니다.","label.text.naver":"네이버","label.button.prev":"이전","label.button.change":"변경","err.user.join":"회원 가입 처리가 완료되지 않았습니다.","err.default.message":"알 수 없는 시스템 오류가 발생했습니다.","common_created_date":"등록일","reserve.msg.find_user":"예약 신청자를 검색을 통해 등록해 주세요.","label.title.new_password_confirm":"신규 비밀번호 확인","common.user":"사용자","valid.reserve_period":"최대 예약 가능 일수보다 예약기간이 깁니다. (최대 예약 가능일 수 : {0})","valid.required":"값은 필수 입니다.","common.select":"선택","code.detail.list":"공통코드상세목록","board":"게시판","statistics":"통계","privacy.privacy_no":"개인정보처리방침 번호","msg.user.email.exists":"이미 사용중인 이메일입니다.","attachment.file_size":"파일 크기","reserve_item.usage_fee":"이용 요금","label.button.selection_restore":"선택복원","content.content_no":"컨텐츠 번호","posts":"게시물","content.information":"컨텐츠 정보","user.user_name":"사용자명","msg.notmodified":"변경된 내용이 없습니다.","menu.url_path":"링크 URL","label.button.cancel":"취소","email.user.password.content":"\n
\n
\"표준프레임워크
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
비밀번호 초기화 안내
\n안녕하세요. %s 회원님.

\n비밀번호 초기화 관련하여 안내드립니다.
\n회원님의 계정 비밀번호를 초기화할 수 있는 URL을 알려드립니다.​

\n[비밀번호 초기화] 버튼으로 접속하여 비밀번호를 초기화 하신 후
서비스를 계속해서 이용해주시기 바랍니다.​

\n감사합니다.\n
\n비밀번호 초기화\n
\n
\n(C) 표준프레임워크 포털 All Rights Reserved.\n
\n
","label.title.new_password":"신규 비밀번호","common.all":"전체","attachment.file_id":"파일 ID","label.text.changed_password":"비밀번호가 초기화되었습니다.\n초기화된 비밀번호를 이용하여 로그인해주시기 바랍니다.","label.button.check_email":"이메일중복확인","reserve_item.manager":"담당자","valid.reserve_close":"예약이 마감되었습니다.","valid.selection.already_saved.format":"선택한 정보는 이미 모두 등록되어 있습니다.","posts.notexists.prev":"이전글이 없습니다.","menu.update_name":"이름변경","file.accept_ext":"업로드 허용 확장자","label.text.join.complete2":"정상적으로 회원 등록이 완료되었습니다.","label.text.join.complete1":"회원가입을 축하드립니다.","msg.placeholder.format":"{0}을(를) 입력하세요.","banner.banner_title":"배너 제목","msg.confirm.restore":"복원하시겠습니까?","reserve_item.reserve_means":"인터넷 예약 구분","valid.notexists.format":"{0}이(가) 없습니다.","valid.upload_limit_size.format":"파일의 용량은 {0}까지 업로드 가능합니다.","valid.required.format":"{0}을(를) 입력해주세요.","label.title.mypage":"마이페이지","common.msg.would.format":"을(를) 하시겠습니까?","reserve.number_of_people":"인원","label.button.restore":"복원","common.join":"회원가입","reserve.request":"신청","reserve.purpose":"목적","reserve_item":"예약 물품","common.type":"구분","common.sitemap":"사이트맵","common.no":"번호","login.password_find":"비밀번호 찾기","posts.posts_content":"내용","valid.reserve_date":"해당 날짜에는 예약할 수 없습니다.","common.last_modified_by":"최종 수정자","common.created_datetime":"등록 일시","menu.sub_name":"메뉴 서브명","err.user.password.notmatch":"잘못된 비밀번호입니다. 다시 시도하거나 비밀번호를 재설정하세요.","attachment":"첨부파일","posts.posts_no":"게시물 번호","msg.user.email.check":"이메일 중복을 확인해주세요.","msg.success.delete":"성공적으로 삭제되었습니다.","reserve":"예약","valid.file.not_found":"파일을 찾을 수 없습니다.","label.button.desc":"최신순","common.token":"토큰","msg.placeholder":"을(를) 입력하세요.","label.title.join":"회원가입","err.db.constraint.delete":"참조하는 데이터가 있어 삭제할 수 없습니다","common.written_date":"작성일","reserve_item.dept":"소속","code.list":"공통코드목록","board.upload_limit_count":"업로드 제한 수","common.delete_at":"삭제 여부","code.detail.edit":"공통코드상세편집","common.more":"더보기","label.text.google":"구글","banner":"배너","code.code_name":"코드 명","valid.email.pattern":"이메일 주소를 확인해주세요.","label.button.list":"목록","banner.attachment_code":"배너 파일","label.text.user.leave1":"그동안 이용해주셔서 감사합니다.","menu.icon":"메뉴 아이콘","label.text.user.leave2":"회원탈퇴 전에 안내사항을 확인해주세요.","board.reply_use_at":"답글 사용 여부","menu.name":"메뉴명","file.placeholder":"업로드 할 파일을 선택해주세요.","err.user.login":"아이디 또는 비밀번호가 잘못 입력 되었습니다.\n아이디와 비밀번호를 정확히 입력해 주세요.","err.user.find.password":"비밀번호 찾기 중 예기치 않은 예외가 발생했습니다.","privacy.privacy_title":"개인정보처리방침 제목","valid.selection.already_deleted.format":"선택한 정보는 이미 모두 삭제되어 있습니다.","err.user.state.cantlogin":"로그인할 수 없는 회원입니다.","common.attachment":"첨부파일","code.parent_code_id":"상위 코드 ID","msg.confirm.save":"저장하시겠습니까?","common.information":"정보","posts.reply_placeholder":"댓글을 남겨주세요.","authorization.information":"인가 정보"} \ No newline at end of file +{"role_authorization":"권한 인가","common.use_at":"사용 여부","common.free":"무료","common.delete.creator":"작성자에 의해 삭제된 댓글입니다.","label.button.close":"닫기","err.invalid.input.value":"입력값이 올바르지 않습니다","reserve_item.operation":"운영","label.text.leave.complete1":"정상적으로 탈퇴 처리 되었습니다.","label.text.leave.complete2":"그동안 이용해주셔서 감사합니다.","label.title.home":"홈","menu.eng_name":"영문 메뉴명","reserve_item.is_possible":"예약 가능 여부","label.button.all_checked":"전체체크","menu.no":"메뉴 번호","common.address":"주소","reserve.msg.calcel_reason":"취소 사유를 입력하세요.","label.text.modified_password":"비밀번호가 정상적으로 변경되었습니다.\n변경된 비밀번호는 다음 로그인시부터 적용됩니다.","file.msg_limit.format":"파일은 최대 {0}까지 업로드할 수 있습니다.","common.search":"검색","board.comment_use_at":"댓글 사용 여부","label.title.required":"필수입력항목","role.role_content":"권한 내용","label.button.all_unchecked":"전체해제","menu.type":"메뉴 유형","common.created_date":"등록일","label.title.change_password":"비밀번호 변경","valid.format_not_match":"형식이 맞지 않습니다.","role.information":"권한 정보","valid.reserve_not_update":"해당 예약은 수정할 수 없습니다.","board.upload_use_at":"업로드 사용 여부","label.button.reply":"답글 작성","menu.all_expand":"전체펼침","user.login.provider":"로그인 방법","menu.all_collapse":"전체접기","reserve_item.selection_means":"선별 방법","menu.self":"현재창","attachment.file_name":"파일명","reserve_item.request":"예약신청","reserve_item.impossible":"예약 불가","label.button.next":"다음","comment.comment_title":"제목","menu.site":"사이트","reserve.msg.find_item":"예약물품 검색을 이용하여 예약 신청하실 물품을 등록해주세요.","reserve_item.contact":"문의처","role.manage_authorization":"권한매핑관리","common.cancel":"취소","reserve.cancel_reason":"취소 사유","privacy.privacy_content":"개인정보처리방침 내용","role":"권한","common.approve":"승인","err.user.notexists":"회원이 존재하지 않습니다.","board.skin_type_code":"스킨 유형","valid.file.not_deleted":"파일을 삭제할 수 없습니다.","menu.show_at":"출력 여부","valid.to_be_fast.format":"{0}이 {1} 보다 빠릅니다.","login.email_save":"이메일 저장","user.user_state_code":"사용자 상태","err.user.social.cannotuse":"소셜 회원은 이용할 수 없습니다.","common.required_fields":"필수입력항목","msg.success.permanent_delete":"성공적으로 완전삭제되었습니다.","valid.cant_cancel":"해당 예약은 취소할 수 없습니다.","menu.blank":"새창","err.title":"시스템 오류","banner.banner_type_code":"배너 구분","common.target":"대상","label.text.password_format":"* 영문, 숫자, 특수기호가 포함된 8자~20자리","err.method.not.allowed":"해당 요청은 사용 불가능한 상태입니다","valid.file.not_saved_try_again":"파일을 저장할 수 없습니다. 다시 시도해 주세요.","policy":"이용약관","common.start_datetime":"시작일시","user.last_login_date":"최종 로그인 일시","attachment.download_count":"다운로드 수","email.user.password.title":"비밀번호 재설정을 위한 안내메일입니다.","common.url":"URL","board.new_display_day_count":"신규 표시 일 수","err.user.login.social":"소셜 로그인을 할 수 없습니다.","common.manage":"관리","reserve_item.reserve_method":"예약 방법","label.button.join":"가입","valid.password":"비밀번호는 영문 숫자 특수기호가 포함된 8자~20자리 이내로 입력해주세요.","common.written_by":"작성자","common.agree.n":"동의안함","err.access.denied":"해당 요청에 대한 접근이 거절되었습니다","menu.valid.delete":"삭제할 메뉴를 선택해 주세요.","label.button.permanent_delete":"완전 삭제","menu.outside_link_help":"외부 페이지링크는 http// 또는 https// 를 포함하여 입력해주시기 바랍니다.","statistics.daily":"일별","err.internal.server":"서버 오류가 발생했습니다","common.agree.y":"동의함","reserve_item.period_possible":"기간 지정 가능여부","err.entity.not.found":"해당 데이터가 존재하지 않습니다","code.code_description":"코드 설명","label.title.name":"이름","common.end_date":"종료일","common.paid":"유료","reserve.msg.complete":"정상적으로 예약신청이 완료되었습니다.","label.text.user.leave.password":"회원탈퇴를 하시려면 현재 비밀번호를 입력해주세요.","label.button.add":"추가","valid.reserve_count":"해당 날짜에 예약할 수 있는 재고수량이 없습니다.","menu.valid.change_name":"이름을 변경할 메뉴를 선택해 주세요.","label.title.oauth":"간편인증","valid.file.too_big":"파일 용량이 너무 큽니다.","common.noti":"알림","valid.reserve.number_of_people":"신청인원이 수용인원보다 많습니다.","code.code_id":"코드 ID","valid.minlength.format":"{0}자 이상으로 입력해주세요.","err.invalid.type.value":"타입이 올바르지 않습니다","common.basic":"기본","board.page_display_count":"페이지 표시 수","reserve_item.max_period_days":"최대 예약 가능 일수","msg.user.find.password":"회원님의 메일주소 {0}로\n비밀번호를 초기화하는 URL을 전송하였습니다.\n메일을 확인하여 비밀번호를 초기화한 후 로그인하세요.","msg.join.agree2":"개인정보수집에 동의해주세요.","banner.new_window_at":"새 창 여부","msg.join.agree1":"이용약관에 동의해주세요.","label.button.reg":"등록","authorization.url_pattern_value":"패턴","valid.user.password.notchange":"현재 비밀번호와 동일한 비밀번호 입니다.","err.duplicate.input.value":"중복된 값을 입력하였습니다","content.content_remark":"컨텐츠 설명","posts.prev_post":"이전글","posts.qna_content":"질문내용","msg.user.email.notexists":"사용 가능한 이메일입니다.","user.login_lock_at":"로그인 잠금 여부","reserve.phone":"휴대전화","common.status":"상태","label.button.selection_registration":"선택등록","valid.value_as_number":"숫자만 입력가능합니다.","label.title.login.oauth":"간편로그인","reserve_item.excluded":"사용허가 제외대상","common.modified_date":"수정 일시","label.button.save":"저장","err.posts.deleted":"삭제된 게시물입니다.","label.button.first":"처음으로","posts.qna_title":"질문제목","err.user.change.password":"인증시간이 만료되었습니다.\n처음부터 다시 진행해주시기 바랍니다.","valid.upload_limit_count.format":"파일은 최대 {0}개까지 업로드 가능합니다.","reserve_item.inventory":"재고(인원)","board.information":"게시판 정보","menu.connect_type":"연결 형태","content.content_value":"컨텐츠 내용","board.board_name":"게시판 명","role.role_id":"권한 id","valid.file.not_exists":"업로드할 파일이 없습니다.","reserve_item.external_url":"외부링크 URL","label.button.confirm":"확인","common.home_page_address":"홈페이지 주소","comment.comment_content":"내용","code.detail_count":"코드 상세수","common.read_count":"조회 수","privacy":"개인정보처리방침","code.detail.title":"공통코드상세관리","role.role_name":"권한 명","statistics.day":"일","content":"컨텐츠","reserve_item.type":"유형","label.button.leave":"탈퇴","board.post_display_count":"게시물 표시 수","reserve.status":"신청 상태","common.login":"로그인","statistics.monthly":"월별","reserve_item.add_information":"부가 정보","label.text.required.login":"회원님의 개인정보를 안전하게 보호하기 위해 인증 후 변경이 가능합니다.","reserve.period":"기간","board.editor_use_at":"에디터 사용 여부","posts.notexists.next":"다음글이 없습니다.","posts.board_no":"게시판 번호","code.title":"공통코드관리","label.text.user.leave.guide1":"회원탈퇴 후 입력하신 문의 및 게시물 등은 삭제되지 않으며, 회원정보 삭제로 인해 작성자 본인을 확인할 수 없어 편집 및 삭제 처리가 불가능합니다.","label.text.user.leave.guide2":"문의 및 게시물 삭제를 원하시는 경우에는 먼저 해당 게시물을 삭제하신 후 탈퇴를 신청하시기 바랍니다.","label.text.user.leave.guide3":"회원탈퇴 후 모든 개인정보는 개인정보 처리방침에 의거하여 삭제됩니다.","label.button.go_home":"처음으로","posts.next_post":"다음글","attachment.file_no":"파일 순번","label.button.find":"찾기","msg.success.restore":"성공적으로 복원되었습니다.","statistics.access":"접속 통계","label.button.delete":"삭제","location":"지역","label.text.kakao":"카카오","comment":"댓글","err.required.login":"로그인 후 다시 시도해주세요.","posts.notice_at":"공지 여부","label.title.current_password":"현재 비밀번호","common.delete.manager":"관리자에 의해 삭제된 댓글입니다.","reserve_titem.msg.help_period":"기간 지정 신청인 경우 1일 기준","common.provider":"공급자","err.user.join.social":"소셜 회원 가입 처리 중 예기치 않은 예외가 발생했습니다.","posts.posts_answer_content":"답변","location.name":"지역 명","common.notice":"공지","authorization":"인가","menu.description":"메뉴 설명","authorization.authorization_no":"인가 번호","valid.selection.already_restored.format":"선택한 정보는 이미 모두 복원되어 있습니다.","valid.password.confirm":"비밀번호가 일치하지 않습니다.","file.search":"파일찾기","common.contact":"연락처","authorization.http_method_code":"Http Method","label.title.password_confirm":"비밀번호 확인","reserve_item.purpose":"용도","board.board_no":"게시판 번호","msg.inventory_failed":"재고 업데이트에 실패했습니다.","msg.confirm.permanent_delete":"완전히 삭제하시겠습니까?","valid.manager_approve":"관리자만 승인할 수 있습니다.","posts.see_more":"더보기","common.read":"조회","valid.file.invalid_name":"파일명이 잘못되었습니다.","user.password":"비밀번호","valid.maxlength.format":"{0}자 이하로 입력해주세요.","posts.information":"게시물 정보","board.user_write_at":"사용자 작성 여부","menu.info_title":"메뉴 기본 설정","label.button.comment":"답글","reserve.msg.possible_count":"신청기간내 예약가능 수량","msg.success.save":"성공적으로 저장되었습니다.","reserve.count":"수량","label.button.selection_delete":"선택삭제","common.msg.done.format":"이(가) 완료되었습니다.","code.manage":"코드 관리","board.title_display_length":"제목 표시 길이","valid.cant_cancel_because_done":"해당 예약은 이미 실행되어 취소할 수 없습니다.","privacy.information":"개인정보처리방침 정보","label.button.edit":"수정","valid.value_as_date":"날짜 형식으로 입력해주세요.","statistics.year":"년","err.unauthorized":"권한이 불충분합니다","err.board.not_use_comment":"댓글 사용이 금지된 게시판입니다.","user.email":"이메일","common.logout":"로그아웃","code.code":"코드","reserve_item.possible":"예약 가능","msg.confirm.join.social":"가입 정보가 없습니다. 회원가입 페이지로 이동하시겠습니까?","common.created_by":"등록자","menu.new_menu":"새 메뉴","err.user.social.get":"공급사에서 회원 정보를 확인할 수 없습니다.","posts.posts_title":"제목","reserve_item.target":"이용 대상","label.button.change_password":"비밀번호 변경","board.upload_limit_size":"업로드 제한 크기(byte)","msg.confirm.registration":"등록하시겠습니까?","banner.banner_content":"배너 내용","valid.reserve_number_of_people":"예약가능한 인원이 부족합니다. (남은 인원 : {0})","label.text.user.password.modified":"비밀번호가 정상적으로 변경되었습니다.","common.created_at":"등록 여부","reserve_item.name":"예약 물품 명","err.page.not.found":"해당 페이지를 찾을 수 없습니다","common.search_word":"검색어","valid.between.format":"{0} ~ {1} 사이의 값을 입력해주세요.","content.content_name":"컨텐츠 명","valid.reserve_not_update_status":"예약 신청 상태인 경우에만 수정 가능합니다.","msg.confirm.leave":"탈퇴하시겠습니까?","common.sort_seq":"정렬 순서","common.end_datetime":"종료일시","label.button.selection_permanent_delete":"선택완전삭제","reserve.user":"예약자","menu":"메뉴","label.title.agree2":"개인정보수집동의","label.title.find_password":"비밀번호 찾기","label.title.agree1":"이용약관","label.title.leave":"회원탈퇴","err.unprocessable.entity":"처리할 수 없는 값입니다","label.button.asc":"등록순","common.start_date":"시작일","code.edit":"공통코드편집","statistics.month":"월","policy.title":"약관제목","label.title.guide":"안내사항","posts.attachment_code":"첨부파일 코드","err.user.socail.find":"소셜 회원 정보를 조회하지 못했습니다.","valid.selection.format":"{0}을(를) 선택해주세요.","msg.confirm.delete":"삭제하시겠습니까?","authorization.authorization_name":"인가 명","valid.to_be_slow.format":"{0}이 {1} 보다 늦습니다.","label.button.deselect":"선택해제","err.user.social.notmatch":"소셜 정보와 회원 정보가 일치하지 않습니다.","label.text.user.info.modified":"회원정보가 정상적으로 변경되었습니다.","label.text.naver":"네이버","label.button.prev":"이전","label.button.change":"변경","err.user.join":"회원 가입 처리가 완료되지 않았습니다.","err.default.message":"알 수 없는 시스템 오류가 발생했습니다.","common_created_date":"등록일","reserve.msg.find_user":"예약 신청자를 검색을 통해 등록해 주세요.","label.title.new_password_confirm":"신규 비밀번호 확인","common.user":"사용자","valid.reserve_period":"최대 예약 가능 일수보다 예약기간이 깁니다. (최대 예약 가능일 수 : {0})","valid.required":"값은 필수 입니다.","common.select":"선택","code.detail.list":"공통코드상세목록","board":"게시판","statistics":"통계","privacy.privacy_no":"개인정보처리방침 번호","msg.user.email.exists":"이미 사용중인 이메일입니다.","attachment.file_size":"파일 크기","reserve_item.usage_fee":"이용 요금","label.button.selection_restore":"선택복원","content.content_no":"컨텐츠 번호","posts":"게시물","content.information":"컨텐츠 정보","user.user_name":"사용자명","msg.notmodified":"변경된 내용이 없습니다.","menu.url_path":"링크 URL","label.button.cancel":"취소","email.user.password.content":"\n
\n
\"표준프레임워크
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
비밀번호 초기화 안내
\n안녕하세요. %s 회원님.

\n비밀번호 초기화 관련하여 안내드립니다.
\n회원님의 계정 비밀번호를 초기화할 수 있는 URL을 알려드립니다.​

\n[비밀번호 초기화] 버튼으로 접속하여 비밀번호를 초기화 하신 후
서비스를 계속해서 이용해주시기 바랍니다.​

\n감사합니다.\n
\n비밀번호 초기화\n
\n
\n(C) 표준프레임워크 포털 All Rights Reserved.\n
\n
","label.title.new_password":"신규 비밀번호","common.all":"전체","attachment.file_id":"파일 ID","label.text.changed_password":"비밀번호가 초기화되었습니다.\n초기화된 비밀번호를 이용하여 로그인해주시기 바랍니다.","label.button.check_email":"이메일중복확인","reserve_item.manager":"담당자","valid.reserve_close":"예약이 마감되었습니다.","valid.selection.already_saved.format":"선택한 정보는 이미 모두 등록되어 있습니다.","posts.notexists.prev":"이전글이 없습니다.","menu.update_name":"이름변경","file.accept_ext":"업로드 허용 확장자","label.text.join.complete2":"정상적으로 회원 등록이 완료되었습니다.","label.text.join.complete1":"회원가입을 축하드립니다.","msg.placeholder.format":"{0}을(를) 입력하세요.","banner.banner_title":"배너 제목","msg.confirm.restore":"복원하시겠습니까?","reserve_item.reserve_means":"인터넷 예약 구분","valid.notexists.format":"{0}이(가) 없습니다.","valid.upload_limit_size.format":"파일의 용량은 {0}까지 업로드 가능합니다.","valid.required.format":"{0}을(를) 입력해주세요.","label.title.mypage":"마이페이지","common.msg.would.format":"을(를) 하시겠습니까?","reserve.number_of_people":"인원","label.button.restore":"복원","common.join":"회원가입","reserve.request":"신청","reserve.purpose":"목적","reserve_item":"예약 물품","common.type":"구분","common.sitemap":"사이트맵","common.no":"번호","login.password_find":"비밀번호 찾기","posts.posts_content":"내용","valid.reserve_date":"해당 날짜에는 예약할 수 없습니다.","common.last_modified_by":"최종 수정자","common.created_datetime":"등록 일시","menu.sub_name":"메뉴 서브명","err.user.password.notmatch":"잘못된 비밀번호입니다. 다시 시도하거나 비밀번호를 재설정하세요.","attachment":"첨부파일","posts.posts_no":"게시물 번호","msg.user.email.check":"이메일 중복을 확인해주세요.","msg.success.delete":"성공적으로 삭제되었습니다.","reserve":"예약","valid.file.not_found":"파일을 찾을 수 없습니다.","label.button.desc":"최신순","common.token":"토큰","msg.placeholder":"을(를) 입력하세요.","label.title.join":"회원가입","err.db.constraint.delete":"참조하는 데이터가 있어 삭제할 수 없습니다","common.written_date":"작성일","reserve_item.dept":"소속","code.list":"공통코드목록","board.upload_limit_count":"업로드 제한 수","common.delete_at":"삭제 여부","code.detail.edit":"공통코드상세편집","common.more":"더보기","label.text.google":"구글","banner":"배너","code.code_name":"코드 명","valid.email.pattern":"이메일 주소를 확인해주세요.","label.button.list":"목록","banner.attachment_code":"배너 파일","label.text.user.leave1":"그동안 이용해주셔서 감사합니다.","menu.icon":"메뉴 아이콘","label.text.user.leave2":"회원탈퇴 전에 안내사항을 확인해주세요.","board.reply_use_at":"답글 사용 여부","menu.name":"메뉴명","file.placeholder":"업로드 할 파일을 선택해주세요.","err.user.login":"아이디 또는 비밀번호가 잘못 입력 되었습니다.\n아이디와 비밀번호를 정확히 입력해 주세요.","err.user.find.password":"비밀번호 찾기 중 예기치 않은 예외가 발생했습니다.","privacy.privacy_title":"개인정보처리방침 제목","valid.selection.already_deleted.format":"선택한 정보는 이미 모두 삭제되어 있습니다.","err.user.state.cantlogin":"로그인할 수 없는 회원입니다.","common.attachment":"첨부파일","code.parent_code_id":"상위 코드 ID","msg.confirm.save":"저장하시겠습니까?","common.information":"정보","posts.reply_placeholder":"댓글을 남겨주세요.","authorization.information":"인가 정보"} \ No newline at end of file diff --git a/frontend/portal/src/components/App/index.tsx b/frontend/portal/src/components/App/index.tsx index 815d081..570da3d 100644 --- a/frontend/portal/src/components/App/index.tsx +++ b/frontend/portal/src/components/App/index.tsx @@ -36,6 +36,7 @@ const App = ({ component: Component, ...pageProps }: AppProps) => { const router = useRouter() const pathname = router.pathname const authPage = pathname?.startsWith('/auth/') + const naverLoginCallbackPage = pathname?.startsWith('/auth/login/naver') const errorPage = router.pathname === '/404' || router.pathname === '/_error' const { enqueueSnackbar } = useSnackbar() @@ -127,7 +128,7 @@ const App = ({ component: Component, ...pageProps }: AppProps) => { return null } - return errorPage ? ( + return errorPage || naverLoginCallbackPage ? ( diff --git a/frontend/portal/src/components/Buttons/KakaoLoginButton.tsx b/frontend/portal/src/components/Buttons/KakaoLoginButton.tsx index 635eb5e..51832f0 100644 --- a/frontend/portal/src/components/Buttons/KakaoLoginButton.tsx +++ b/frontend/portal/src/components/Buttons/KakaoLoginButton.tsx @@ -1,12 +1,17 @@ -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import KakaoLogin from 'react-kakao-login' import { KAKAO_JAVASCRIPT_KEY } from '@constants/env' import { ISocialButton } from '@components/Buttons/GoogleLoginButton' import CustomConfirm, { CustomConfirmPrpps } from '@components/CustomConfirm' -const KakaoLoginButton = (props: ISocialButton) => { - const { handleClick, confirmMessage } = props +export interface ISocialKakaoButton extends ISocialButton { + kakaoLoginMode?: string + setKakaoLoginMode?: any +} + +const KakaoLoginButton = (props: ISocialKakaoButton) => { + const { handleClick, confirmMessage, kakaoLoginMode, setKakaoLoginMode } = props const { t } = useTranslation() const [customConfirm, setCustomConfirm] = useState({ @@ -15,6 +20,23 @@ const KakaoLoginButton = (props: ISocialButton) => { handleCancel: () => {}, }) + useEffect(() => { + // 라이브러리에서 로그인 상태를 유지하고 바꿀 수 없어서 이런 코드를.. + if (kakaoLoginMode !== 'logout' || !document || !document.querySelector('#kakaoIdLogin')) { + return + } + + const kakaoLoginButton = document.querySelector('#kakaoIdLogin') + + // @ts-ignore + kakaoLoginButton.href = 'javascript:void(0);' + + // @ts-ignore + kakaoLoginButton.click() + + setKakaoLoginMode(null) + }, [kakaoLoginMode]) + return ( <> { render={(_props: any) => ( { event.preventDefault() diff --git a/frontend/portal/src/components/Buttons/NaverLoginButton.tsx b/frontend/portal/src/components/Buttons/NaverLoginButton.tsx index 6aa2ff7..9c29af3 100644 --- a/frontend/portal/src/components/Buttons/NaverLoginButton.tsx +++ b/frontend/portal/src/components/Buttons/NaverLoginButton.tsx @@ -47,6 +47,7 @@ const NaverLoginButton = (loginButtonProps: ISocialButton) => { }) naverLogin.init() + if (!window.opener) { naver.successCallback = data => { return onSuccess(data) @@ -91,28 +92,28 @@ const NaverLoginButton = (loginButtonProps: ISocialButton) => { } const loadScript = useCallback(() => { - if (mounted) { - if ( - document && - document.querySelectorAll('#naver-login-sdk').length === 0 - ) { - let script = document.createElement('script') - script.id = 'naver-login-sdk' - script.src = NAVER_ID_SDK_URL - script.onload = () => { - return initLoginButton() - } - document.head.appendChild(script) - } else { - initLoginButton() + if ( + document && + document.querySelectorAll('#naver-login-sdk').length === 0 + ) { + let script = document.createElement('script') + script.id = 'naver-login-sdk' + script.src = NAVER_ID_SDK_URL + script.onload = () => { + return initLoginButton() } + document.head.appendChild(script) + } else { + initLoginButton() } - }, [mounted]) + }, []) useEffect(() => { - appendNaverButton() - loadScript() - }, []) + if (mounted) { + appendNaverButton() + loadScript() + } + }, [mounted]) const handleLogin = () => { if (!document || !document.querySelector('#naverIdLogin').firstChild) { diff --git a/frontend/portal/src/pages/api/login/[...path].ts b/frontend/portal/src/pages/api/login/[...path].ts index ba3d4a0..12f2e31 100644 --- a/frontend/portal/src/pages/api/login/[...path].ts +++ b/frontend/portal/src/pages/api/login/[...path].ts @@ -70,7 +70,7 @@ export default async (req: NextApiRequest, res: NextApiResponse) => { res.status(200).json(payload) } else { - res.status(401).json({ message: 'Invalid Credentials 🥺' }) + res.status(result.status).json({ message: 'Invalid Credentials 🥺' }) } } else { res.status(401).json({ message: 'Invalid Credentials 🥺' }) diff --git a/frontend/portal/src/pages/auth/join/form.tsx b/frontend/portal/src/pages/auth/join/form.tsx index 72f2ce6..05034bb 100644 --- a/frontend/portal/src/pages/auth/join/form.tsx +++ b/frontend/portal/src/pages/auth/join/form.tsx @@ -2,12 +2,13 @@ import CustomAlert, { CustomAlertPrpps } from '@components/CustomAlert' import { DLWrapper } from '@components/WriteDLFields' import { makeStyles, Theme } from '@material-ui/core/styles' import Alert from '@material-ui/lab/Alert' -import { userService } from '@service' +import { ISocialUser, userService } from '@service' import { format, isValidPassword } from '@utils' import { useRouter } from 'next/router' -import React, { createRef, useState } from 'react' +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: { @@ -20,9 +21,17 @@ interface IUserForm { password: string passwordConfirm: string userName: string + provider?: string + token?: string } -const Form = () => { +interface FormProps { + socialUser: ISocialUser +} + +const Form = (props: FormProps) => { + const { socialUser } = props + const router = useRouter() const classes = useStyles() const { t } = useTranslation() @@ -44,10 +53,12 @@ const Form = () => { // form hook const methods = useForm({ defaultValues: { - email: '', + email: socialUser.email || '', password: '', passwordConfirm: '', - userName: '', + userName: socialUser.name || '', + provider: router.query.provider as string, + token: router.query.token as string, }, }) const { @@ -67,6 +78,14 @@ const Form = () => { }) } + useEffect(() => { + if (socialUser) { + if (socialUser.name) { + + } + } + }, [socialUser]) + // 이메일중복확인 const handleCheckEmail = event => { event.preventDefault() @@ -156,6 +175,7 @@ const Form = () => { { > { ) } +export const getServerSideProps: GetServerSideProps = async context => { + const provider = context.query.provider as string + const token = context.query.token as string + + let socialUser = {} + + try { + if (provider && token) { + const result = await userService.social(provider, token) + if (result) { + socialUser = (await result.data) as ISocialUser + } + } + } catch (error) { + console.error(`social item query error ${error.message}`) + if (error.response?.data?.code === 'E003') { + return { + notFound: true, + } + } + } + + return { + props: { + socialUser + }, + } +} + export default Form diff --git a/frontend/portal/src/pages/auth/join/index.tsx b/frontend/portal/src/pages/auth/join/index.tsx index f27d155..25643be 100644 --- a/frontend/portal/src/pages/auth/join/index.tsx +++ b/frontend/portal/src/pages/auth/join/index.tsx @@ -61,7 +61,7 @@ const Join = ({ policyPP, policyTOS }: IJoinProps) => { return } - router.push('/auth/join/form') + router.push(`/auth/join/form?provider=${router.query.provider}&token=${router.query.token}`) } return ( diff --git a/frontend/portal/src/pages/auth/login/index.tsx b/frontend/portal/src/pages/auth/login/index.tsx index 1b023c8..c02809a 100644 --- a/frontend/portal/src/pages/auth/login/index.tsx +++ b/frontend/portal/src/pages/auth/login/index.tsx @@ -9,17 +9,26 @@ import Loader from '@components/Loader' import useUser from '@hooks/useUser' import { ILogin, loginSerivce } from '@service' import { userAtom } from '@stores' -import Router from 'next/router' +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 +} const Login = () => { const { t } = useTranslation() + const router = useRouter() const { isLogin, mutate } = useUser() const user = useRecoilValue(userAtom) + + const [customConfirm, setCustomConfirm] = useState(null) const [errorState, setErrorState] = useState(null) + const [kakaoLoginMode, setKakaoLoginMode] = useState(null) useEffect(() => { if (isLogin && user) { @@ -42,7 +51,29 @@ const Login = () => { setErrorState(result) } } catch (error) { - setErrorState(t('err.user.login')) + if (error === 'join') { + setCustomConfirm({ + open: true, + message: t('msg.confirm.join.social'), + handleConfirm: () => { + setCustomConfirm({ + ...customConfirm, + open: false, + }) + + // recoil 쓰려했는데 회원가입에 스탭이 있어서 진행중에 새로고침하면 상태가 삭제되면서 일반회원으로 가입될 수 있어서 소셜 정보를 파라미터로 넘김 + router.push(`/auth/join?provider=${data.provider}&token=${data.token}`) + }, + handleCancel: () => { + if (data.provider === 'kakao') { + setKakaoLoginMode('logout') + } + setCustomConfirm({ ...customConfirm, open: false }) + }, + }) + } else { + setErrorState(t('err.user.login')) + } } } @@ -105,11 +136,19 @@ const Login = () => { {t('label.title.login.oauth')}
- +
+ {customConfirm && ( + + )} ) } diff --git a/frontend/portal/src/pages/auth/login/naver.tsx b/frontend/portal/src/pages/auth/login/naver.tsx index 64da19f..8e57181 100644 --- a/frontend/portal/src/pages/auth/login/naver.tsx +++ b/frontend/portal/src/pages/auth/login/naver.tsx @@ -14,7 +14,7 @@ const LoginNaver = () => { return <> */ - return {}} /> + return
{}} />
} export default LoginNaver diff --git a/frontend/portal/src/pages/user/info/index.tsx b/frontend/portal/src/pages/user/info/index.tsx index 1dfeb8b..c20419b 100644 --- a/frontend/portal/src/pages/user/info/index.tsx +++ b/frontend/portal/src/pages/user/info/index.tsx @@ -150,9 +150,8 @@ const UserInfo = () => { token: response.response.access_token, }, }) - setErrorState(null) } else { - setErrorState(t('err.user.login.social')) + setErrorState({ message: t('err.user.login.social') }) } } @@ -173,9 +172,8 @@ const UserInfo = () => { token: response.accessToken, }, }) - setErrorState(null) } else { - setErrorState(t('err.user.login.social')) + setErrorState({ message: t('err.user.login.social') }) } } @@ -193,9 +191,8 @@ const UserInfo = () => { token: response.tokenId, }, }) - setErrorState(null) } else { - setErrorState(t('err.user.login.social')) + setErrorState({ message: t('err.user.login.social') }) } } diff --git a/frontend/portal/src/service/Login.ts b/frontend/portal/src/service/Login.ts index 0f9395e..62bb1f8 100644 --- a/frontend/portal/src/service/Login.ts +++ b/frontend/portal/src/service/Login.ts @@ -34,6 +34,8 @@ export const loginSerivce = { if (result.status === 200) { onSuccessLogin(await result.json()) resolve('success') + } if (result.status === 412) { + reject('join') } else { reject('noAuth') } diff --git a/frontend/portal/src/service/User.ts b/frontend/portal/src/service/User.ts index 02ce195..02be44c 100644 --- a/frontend/portal/src/service/User.ts +++ b/frontend/portal/src/service/User.ts @@ -38,10 +38,19 @@ interface IUserUpdate extends IVerification { userName: string } +// 소셜 정보 +export interface ISocialUser { + id: string + email: string + name: string +} + /** * 사용자 관리 서비스 */ export const userService = { + social: (provider: string, token: string) => + axios.post(`${USER_URL}/social`, { provider, token }), existsEmail: (email: string, userId?: string) => new Promise((resolve, rejects) => { axios