From 10553d0131a84a643845d2750d63241faa909594 Mon Sep 17 00:00:00 2001 From: kih00 Date: Tue, 21 Jan 2025 23:18:29 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A6=AC?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker.yml | 56 ++++++------------- .../toyproject/memoWithTags/user/RoleType.kt | 4 ++ .../user/controller/SocialLoginController.kt | 9 +++ .../user/persistence/UserEntity.kt | 3 +- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 62642c1..93fa413 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -69,7 +69,7 @@ jobs: docker push $REPOSITORY_URI:$TAG # 9. Docker 이미지 실행 파일을 EC2로 전달 - - name: Deploy to EC2 + - name: Send Deploy File to EC2 run: | # 1. SSH 개인 키 준비 echo "${{ secrets.EC2_SSH_PRIVATE_KEY }}" > private_key.pem @@ -83,33 +83,6 @@ jobs: echo \"Deploying Docker image with TAG: \$TAG\" echo \"Deploying Docker image with REPOSITORY_URI: \$REPOSITORY_URI\" - # 여기서 부분적으로 시크릿을 확인하기 위해 마스킹(앞 3글자 + 길이 표시) 예시 - # ------------------------------------------------------------------- - echo \"=== Print partial Secrets (masked) for Debug ===\" - # DB_ENDPOINT 전체 길이 - LEN_DB_ENDPOINT=\${#DB_ENDPOINT} - # 앞 3글자 + 나머지 부분을 *로 대체 - DB_ENDPOINT_PARTIAL=\"\${DB_ENDPOINT:0:3}\$(printf '%*s' \$((LEN_DB_ENDPOINT-3)) | tr ' ' '*')\" - echo \"DB_ENDPOINT (length=\$LEN_DB_ENDPOINT) => \$DB_ENDPOINT_PARTIAL\" - - LEN_DB_USERNAME=\${#DB_USERNAME} - DB_USERNAME_PARTIAL=\"\${DB_USERNAME:0:3}\$(printf '%*s' \$((LEN_DB_USERNAME-3)) | tr ' ' '*')\" - echo \"DB_USERNAME (length=\$LEN_DB_USERNAME) => \$DB_USERNAME_PARTIAL\" - - LEN_DB_PASSWORD=\${#DB_PASSWORD} - DB_PASSWORD_PARTIAL=\"\${DB_PASSWORD:0:3}\$(printf '%*s' \$((LEN_DB_PASSWORD-3)) | tr ' ' '*')\" - echo \"DB_PASSWORD (length=\$LEN_DB_PASSWORD) => \$DB_PASSWORD_PARTIAL\" - - # 다른 메일/비밀번호도 같은 방식으로 부분 마스킹 예시 - LEN_MAIL_USERNAME=\${#MAIL_USERNAME} - MAIL_USERNAME_PARTIAL=\"\${MAIL_USERNAME:0:3}\$(printf '%*s' \$((LEN_MAIL_USERNAME-3)) | tr ' ' '*')\" - echo \"MAIL_USERNAME (length=\$LEN_MAIL_USERNAME) => \$MAIL_USERNAME_PARTIAL\" - - LEN_MAIL_PASSWORD=\${#MAIL_PASSWORD} - MAIL_PASSWORD_PARTIAL=\"\${MAIL_PASSWORD:0:3}\$(printf '%*s' \$((LEN_MAIL_PASSWORD-3)) | tr ' ' '*')\" - echo \"MAIL_PASSWORD (length=\$LEN_MAIL_PASSWORD) => \$MAIL_PASSWORD_PARTIAL\" - # ------------------------------------------------------------------- - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin \$REPOSITORY_URI echo \"Container exists: $(docker ps -aq -f name=memowithtags-backend)\" @@ -120,20 +93,25 @@ jobs: docker pull \$REPOSITORY_URI:\$TAG docker run -d \ -p 8080:8080 \ - -e SPRING_PROFILES_ACTIVE=prod \ - -e DB_NAME=memowithtags_db \ - -e DB_ENDPOINT=${{ secrets.DB_ENDPOINT }} \\ - -e DB_USERNAME=${{ secrets.DB_USERNAME }} \ - -e DB_PASSWORD=${{ secrets.DB_PASSWORD }} \ - -e MAIL_USERNAME=${{ secrets.MAIL_USERNAME }} \ - -e MAIL_PASSWORD=${{ secrets.MAIL_PASSWORD }} \ - -e KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }} \ - -e KAKAO_REDIRECT_URL=${{ secrets.KAKAO_REDIRECT_URL }} \ - -e NAVER_CLIENT_ID=${{ secrets.NAVER_CLIENT_ID }} \ - -e NAVER_CLIENT_SECRET=${{ secrets.NAVER_CLIENT_SECRET }} \ + --env-file /home/ubuntu/.env \ --name memowithtags-backend \ \$REPOSITORY_URI:\$TAG" > deploy.sh + # 3. .env 파일 생성 + echo "SPRING_PROFILES_ACTIVE=prod + DB_NAME=memowithtags_db + DB_ENDPOINT=${{ secrets.DB_ENDPOINT }} + DB_USERNAME=${{ secrets.DB_USERNAME }} + DB_PASSWORD=${{ secrets.DB_PASSWORD }} + MAIL_USERNAME=${{ secrets.MAIL_USERNAME }} + MAIL_PASSWORD=${{ secrets.MAIL_PASSWORD }} + KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }} + KAKAO_REDIRECT_URL=${{ secrets.KAKAO_REDIRECT_URL }} + NAVER_CLIENT_ID=${{ secrets.NAVER_CLIENT_ID }} + NAVER_CLIENT_SECRET=${{ secrets.NAVER_CLIENT_SECRET }} + GOOGLE_CLIENT_ID=1234 + GOOGLE_REDIRECT_URI=1234" > .env + # 배포 스크립트 EC2로 전송 scp -i private_key.pem -o StrictHostKeyChecking=no deploy.sh ubuntu@${{ secrets.EC2_PUBLIC_IP }}:/home/ubuntu/ diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/RoleType.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/RoleType.kt index 7cfa24c..7bd09e1 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/RoleType.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/RoleType.kt @@ -3,4 +3,8 @@ package com.wafflestudio.toyproject.memoWithTags.user enum class RoleType(val type: String) { ROLE_USER("ROLE_USER"), ROLE_ADMIN("ROLE_ADMIN"); + + companion object { + fun from(type: String?): RoleType? = entries.find { it.type == type } + } } diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/controller/SocialLoginController.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/controller/SocialLoginController.kt index a7cc837..765c56d 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/controller/SocialLoginController.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/controller/SocialLoginController.kt @@ -3,6 +3,7 @@ package com.wafflestudio.toyproject.memoWithTags.user.controller import com.wafflestudio.toyproject.memoWithTags.exception.OAuthRequestException import com.wafflestudio.toyproject.memoWithTags.user.dto.UserResponse.LoginResponse import com.wafflestudio.toyproject.memoWithTags.user.service.SocialLoginService +import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping @@ -32,6 +33,14 @@ class SocialLoginController( @GetMapping("/oauth/kakao") fun kakaoCallback( @RequestParam("code") code: String + ): ResponseEntity { + val appLink = "memowithtags://oauth/kakao?code=$code" + return ResponseEntity.status(HttpStatus.FOUND).build() + } + + @GetMapping("/oauth/kakao/login") + fun kakaoLogin( + @RequestParam("code") code: String ): ResponseEntity { val (_, accessToken, refreshToken) = socialLoginService.kakaoCallBack(code) return ResponseEntity.ok(LoginResponse(accessToken, refreshToken)) diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/persistence/UserEntity.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/persistence/UserEntity.kt index 627876f..7d9721d 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/persistence/UserEntity.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/persistence/UserEntity.kt @@ -3,7 +3,6 @@ package com.wafflestudio.toyproject.memoWithTags.user.persistence import com.wafflestudio.toyproject.memoWithTags.memo.persistence.MemoEntity import com.wafflestudio.toyproject.memoWithTags.tag.persistence.TagEntity import com.wafflestudio.toyproject.memoWithTags.user.RoleType -import com.wafflestudio.toyproject.memoWithTags.user.RoleType.ROLE_USER import com.wafflestudio.toyproject.memoWithTags.user.SocialType import jakarta.persistence.CascadeType import jakarta.persistence.Column @@ -29,7 +28,7 @@ class UserEntity( @Column(name = "verified", nullable = false) var verified: Boolean = false, @Column(name = "role", nullable = false) - var role: RoleType = ROLE_USER, + var role: RoleType = RoleType.ROLE_USER, @Column(name = "social_type", nullable = true) var socialType: SocialType? = null, @Column(name = "created_at", nullable = false) From 32a725dc1fc48ed7ce8de6fd177693a5bc336ebe Mon Sep 17 00:00:00 2001 From: kih00 Date: Tue, 21 Jan 2025 23:20:34 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A6=AC?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memoWithTags/user/controller/SocialLoginController.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/controller/SocialLoginController.kt b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/controller/SocialLoginController.kt index 765c56d..17092b6 100644 --- a/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/controller/SocialLoginController.kt +++ b/src/main/kotlin/com/wafflestudio/toyproject/memoWithTags/user/controller/SocialLoginController.kt @@ -35,7 +35,9 @@ class SocialLoginController( @RequestParam("code") code: String ): ResponseEntity { val appLink = "memowithtags://oauth/kakao?code=$code" - return ResponseEntity.status(HttpStatus.FOUND).build() + return ResponseEntity.status(HttpStatus.FOUND) + .header("Location", appLink) + .build() } @GetMapping("/oauth/kakao/login")