Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ jobs:
export JWT_SECRET_KEY='${{ secrets.JWT_SECRET_KEY }}'
export ADMIN_SECRET='${{ secrets.ADMIN_SECRET }}'
export KAKAO_APP_KEY='${{ secrets.KAKAO_APP_KEY }}'
export KAKAO_ADMIN_KEY='${{ secrets.KAKAO_ADMIN_KEY }}'

export COOLSMS_API_KEY=${{ secrets.COOLSMS_API_KEY }}
export COOLSMS_API_SECRET=${{ secrets.COOLSMS_API_SECRET }}
Expand Down
1 change: 1 addition & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ services:
JWT_SECRET_KEY: ${JWT_SECRET_KEY}
ADMIN_SECRET: ${ADMIN_SECRET}
KAKAO_APP_KEY: ${KAKAO_APP_KEY}
KAKAO_ADMIN_KEY: ${KAKAO_ADMIN_KEY}
COOLSMS_API_KEY: ${COOLSMS_API_KEY}
COOLSMS_API_SECRET: ${COOLSMS_API_SECRET}
COOLSMS_SENDER: ${COOLSMS_SENDER}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,18 @@ public ResponseEntity<BasicResponse<JwtResDTO.JwtResponse>> signup(
.body(BasicResponse.success(CommonSuccessStatus._OK, jwts));
}

@Operation(summary = "회원 소프트 탈퇴 API")
@PostMapping("/withdraw")
public ResponseEntity<BasicResponse<Void>> withdraw(
@RequestHeader(value = "refresh") String refreshToken,
@AuthenticationPrincipal CustomUserDetails details
){
Long memberId = details.getMemberId();
authService.withdraw(memberId, refreshToken);
return ResponseEntity.ok()
.body(BasicResponse.success(CommonSuccessStatus._OK, null));
}

@Operation(summary = "토큰 재발급 API", description = "access 토큰 기간 만료 시 refresh 토큰으로 재발급합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공", content = @Content(schema = @Schema(implementation = JwtResDTO.JwtResponse.class))),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.meetkey.server.domain.member.entity.Member;
import com.meetkey.server.domain.member.entity.SocialLogin;
import com.meetkey.server.domain.member.enums.Provider;
import com.meetkey.server.domain.member.enums.Status;
import com.meetkey.server.domain.member.repository.SocialLoginRepository;
import com.meetkey.server.domain.member.service.MemberService;
import com.meetkey.server.global.security.jwt.dto.JwtResDTO;
Expand All @@ -21,8 +22,10 @@
import com.meetkey.server.domain.auth.exception.AuthErrorStatus;
import com.meetkey.server.domain.auth.exception.AuthException;
import com.meetkey.server.global.security.oauth.dto.OidcDTO;
import com.meetkey.server.global.security.oauth.kakao.KakaoApiClient;
import com.meetkey.server.global.security.oauth.kakao.KakaoOauthClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -32,12 +35,16 @@

@Service
@RequiredArgsConstructor
@Slf4j
public class AuthService {

private final KakaoApiClient kakaoApiClient;
@Value("${kakao.app-key}")
private String kakaoAppKey;
@Value(("{apple.app-key}"))
private String appleAppKey;
@Value("${kakao.admin-key}")
private String kakaoAdminKey;

private final KakaoOauthClient kakaoOauthClient;
private final AppleOauthClient appleClient;
Expand All @@ -47,7 +54,6 @@ public class AuthService {
private final OauthOidcHelper oAuthOIDCHelper;
private final JwtUtil jwtUtil;
private final MemberService memberService;
private final BadgeService badgeService;

private final SocialLoginRepository socialLoginRepository;
private final RefreshTokenRepository refreshTokenRepository;
Expand Down Expand Up @@ -85,19 +91,20 @@ else if (provider == Provider.APPLE) {
}
else throw new AuthException(AuthErrorStatus.INVALID_SOCIAL);


Member member;
MemberReqDTO.Signup memberReqDTO = OauthConverter.toMemberSignUpDTO(req);
// Member 생성
Member member = memberService.signup(provider, providerId, memberReqDTO);

// 회원 가입시 자동적으로 뱃지 생성
Badge initalBadge = Badge.builder()
.member(member)
.total_score(0)
.level(BadgeLevel.NONE)
.build();
// Member 생성
member = memberService.signup(provider, providerId, memberReqDTO);

badgeRepository.save(initalBadge);
// 회원 가입시 자동적으로 뱃지 생성
Badge initalBadge = Badge.builder()
.member(member)
.total_score(0)
.level(BadgeLevel.NONE)
.build();

badgeRepository.save(initalBadge);

// 밋키 서비스 토큰 발급
return getJwtResponseDTO(member);
Expand Down Expand Up @@ -128,9 +135,32 @@ public JwtResDTO.JwtResponse login(Provider provider, String idToken){

// 존재하면 jwtToken 발급
Member member = socialMember.get().getMember();
if (member.getStatus() == Status.INACTIVE){
return JwtResDTO.JwtResponse.builder()
.accessToken(null)
.refreshToken(null)
.isNewMember(true)
.memberId(member.getId())
.build();
}
return getJwtResponseDTO(member);
}

@Transactional
public void withdraw(Long memberId, String refreshToken){
Member member = memberService.findMemberById(memberId);
SocialLogin socialLogin = socialLoginRepository.findByMember(member)
.orElseThrow(() -> new AuthException(AuthErrorStatus.INVALID_SOCIAL));

log.info("해당 유저의 social ProviderId: " + socialLogin.getProviderId());

member.updateMemberStatus(Status.INACTIVE); // 소프트 탈퇴 처리
member.updatePhoneNumber("");
refreshTokenRepository.delete(refreshToken);

kakaoApiClient.unlink("KakaoAK "+ kakaoAdminKey, "user_id", Long.parseLong(socialLogin.getProviderId()));
}

@Transactional
public JwtResDTO.JwtResponse reissue(String refreshToken){
jwtUtil.isValid(refreshToken, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,4 @@ public class Badge extends BaseEntity {
public void addScore(int score) {
this.total_score += score;
}


}
23 changes: 23 additions & 0 deletions src/main/java/com/meetkey/server/domain/member/entity/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,29 @@ public void updateMemberShip() {
this.membership = Membership.FREE;
}
}
public void updateName(String name){
this.name = name;
}

public void updateGender(Gender gender){
this.gender = gender;
}

public void updateBirthday(LocalDate birthday){
this.birthday = birthday;
}

public void updateHomeTown(HomeTown homeTown){
this.homeTown = homeTown;
}

public void updatePhoneNumber(String phoneNumber){
this.phoneNumber = phoneNumber;
}

public void updateMemberStatus(Status status){
this.status = status;
}

public void increaseRecommend() {
this.recommendCount++;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.meetkey.server.domain.member.repository;

import com.meetkey.server.domain.member.entity.Member;
import com.meetkey.server.domain.member.entity.SocialLogin;
import com.meetkey.server.domain.member.enums.Provider;
import org.springframework.data.jpa.repository.JpaRepository;
Expand All @@ -13,4 +14,6 @@ public interface SocialLoginRepository extends JpaRepository<SocialLogin, Long>
"WHERE s.provider = :provider AND s.providerId = :providerId")
Optional<SocialLogin> findByProviderAndProviderId(
@Param("provider") Provider provider, @Param("providerId") String providerId);

Optional<SocialLogin> findByMember(Member member);
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.meetkey.server.domain.member.entity.mapping.MemberBlock;
import com.meetkey.server.domain.member.enums.Provider;
import com.meetkey.server.domain.member.enums.Role;
import com.meetkey.server.domain.member.enums.Status;
import com.meetkey.server.domain.member.exception.MemberErrorStatus;
import com.meetkey.server.domain.member.exception.MemberException;
import com.meetkey.server.domain.member.repository.MemberBlockRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.meetkey.server.global.security.oauth.kakao;

import com.meetkey.server.global.config.FeignConfig;
import com.meetkey.server.global.config.OauthConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(
name = "KakaoApiClient",
url = "https://kapi.kakao.com",
configuration = {OauthConfig.class, FeignConfig.class}
)
public interface KakaoApiClient {
@PostMapping("/v1/user/unlink")
void unlink(
@RequestHeader("Authorization") String adminKey,
@RequestParam("target_id_type") String targetIdType,
@RequestParam("target_id") Long targetId
);
}
1 change: 1 addition & 0 deletions src/main/resources/application-local.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ admin:
kakao:
app-key: ${KAKAO_APP_KEY:}
map-api-key: ${KAKAO_MAP_API_KEY:}
admin-key: ${KAKAO_ADMIN_KEY:}

apple:
app-key: ${APPLE_APP_KEY:}
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/application-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ admin:
kakao:
app-key: ${KAKAO_APP_KEY:}
map-api-key: ${KAKAO_MAP_API_KEY:}
admin-key: ${KAKAO_ADMIN_KEY:}

apple:
app-key: ${APPLE_APP_KEY:}
1 change: 1 addition & 0 deletions src/main/resources/application-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ admin:

kakao:
app-key: ${KAKAO_APP_KEY:}
admin-key: ${KAKAO_ADMIN_KEY:}
map-api-key: ${KAKAO_MAP_API_KEY:}

apple:
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/static/chat-test.html
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ <h3>📨 Messages</h3>
}

function connect() {
const socket = new SockJS("http://localhost:8080/ws-chat");
const socket = new SockJS("https://meetkey.test-route53.shop/ws-chat");
stompClient = Stomp.over(socket);

const token = document.getElementById("token").value;
Expand Down