Skip to content

Commit

Permalink
#89 Refactor: AppleLogin Refactoring (#103)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeongyun1206 authored Sep 18, 2024
2 parents f922ba8 + da7a819 commit ddc1bfd
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 53 deletions.
21 changes: 0 additions & 21 deletions src/main/java/com/drinkeg/drinkeg/controller/MemberController.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@
public class MemberController {

private final JoinService joinService;
private final TokenService tokenService;
private final AppleLoginService appleLoginService;
private final JWTUtil jwtUtil;

@PostMapping("/join")
public ApiResponse<?> joinProcess(@RequestBody JoinDTO joinDTO) {
Expand All @@ -40,30 +37,12 @@ public ApiResponse<?> joinProcess(@RequestBody JoinDTO joinDTO) {
return ApiResponse.onSuccess("회원가입 성공");
}

@PostMapping("/reissue")
public ApiResponse<?> reissue(HttpServletRequest request, HttpServletResponse response) {

tokenService.reissueRefreshToken(request, response);
return ApiResponse.onSuccess("토큰 재발급 성공");
}

@PatchMapping("/member")
public ApiResponse<MemberResponseDTO> addMemberDetail(@RequestBody MemberRequestDTO memberRequestDTO, @AuthenticationPrincipal PrincipalDetail principalDetail) {
return ApiResponse.onSuccess(joinService.addMemberDetail(memberRequestDTO, principalDetail.getUsername()));
}

@PostMapping("/login/apple")
public ApiResponse<LoginResponse> appleLogin(@RequestBody AppleLoginRequestDTO appleLoginRequestDTO,HttpServletResponse response) throws Exception{

System.out.println("=========start apple login controller============");

if(appleLoginRequestDTO.getIdentityToken() == null){
throw new TempHandler(ErrorStatus.IDENTITY_TOKEN_NOT_FOUND);
}

return ApiResponse.onSuccess(appleLoginService.appleLogin(appleLoginRequestDTO, response));
}



}
33 changes: 33 additions & 0 deletions src/main/java/com/drinkeg/drinkeg/controller/OAuth2Controller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.drinkeg.drinkeg.controller;

import com.drinkeg.drinkeg.apipayLoad.ApiResponse;
import com.drinkeg.drinkeg.apipayLoad.code.status.ErrorStatus;
import com.drinkeg.drinkeg.apipayLoad.handler.TempHandler;
import com.drinkeg.drinkeg.dto.AppleLoginDTO.AppleLoginRequestDTO;
import com.drinkeg.drinkeg.dto.loginDTO.oauth2DTO.LoginResponse;
import com.drinkeg.drinkeg.exception.GeneralException;
import com.drinkeg.drinkeg.service.loginService.AppleLoginService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@RestController
@RequiredArgsConstructor
public class OAuth2Controller {

private final AppleLoginService appleLoginService;
@PostMapping("/login/apple")
public ApiResponse<LoginResponse> appleLogin(@RequestBody AppleLoginRequestDTO appleLoginRequestDTO, HttpServletResponse response) throws Exception{

System.out.println("=========start apple login controller============");

Optional.ofNullable(appleLoginRequestDTO.getIdentityToken())
.orElseThrow(() -> new GeneralException(ErrorStatus.IDENTITY_TOKEN_NOT_FOUND));

return ApiResponse.onSuccess(appleLoginService.appleLogin(appleLoginRequestDTO, response));
}
}
23 changes: 23 additions & 0 deletions src/main/java/com/drinkeg/drinkeg/controller/TokenController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.drinkeg.drinkeg.controller;

import com.drinkeg.drinkeg.apipayLoad.ApiResponse;
import com.drinkeg.drinkeg.service.loginService.TokenService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequiredArgsConstructor
public class TokenController {

private final TokenService tokenService;
@PostMapping("/reissue")
public ApiResponse<?> reissue(HttpServletRequest request, HttpServletResponse response) {

tokenService.reissueRefreshToken(request, response);
return ApiResponse.onSuccess("토큰 재발급 성공");
}
}
21 changes: 21 additions & 0 deletions src/main/java/com/drinkeg/drinkeg/converter/MemberConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.drinkeg.drinkeg.converter;

import com.drinkeg.drinkeg.domain.Member;
import org.springframework.stereotype.Component;

import java.util.Map;


@Component
public class MemberConverter {

public Member toMember(String username, Map<String, Object> claims) {
return Member.builder()
.username(username)
.email((String) claims.get("email")) // email 값을 claims에서 추출
.role("ROLE_USER")
.isFirst(true)
.build();

}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.drinkeg.drinkeg.service.loginService;

import com.drinkeg.drinkeg.converter.MemberConverter;
import com.drinkeg.drinkeg.domain.Member;
import com.drinkeg.drinkeg.dto.AppleLoginDTO.AppleLoginRequestDTO;
import com.drinkeg.drinkeg.dto.loginDTO.oauth2DTO.LoginResponse;
Expand Down Expand Up @@ -35,66 +36,41 @@ public class AppleLoginService {
private final MemberRepository memberRepository;
private final RedisClient redisClient;
private final JWTUtil jwtUtil;
private final MemberConverter memberConverter;

public LoginResponse appleLogin(AppleLoginRequestDTO appleLoginRequestDTO, HttpServletResponse response)throws AuthenticationException, NoSuchAlgorithmException, InvalidKeySpecException,
JsonProcessingException {

System.out.println("--------------apple Login Start---------------");

String identityToken = appleLoginRequestDTO.getIdentityToken();

// identity Token에서 헤더 추출
final Map<String, String> appleTokenHeader = tokenService.parseHeaders(appleLoginRequestDTO.getIdentityToken());

// 애플 서버에서 publicKey 받아온 후에 identity 토큰의 헤더와 일치하는 publicKey 만들기
PublicKey publicKey = applePublicKeyGenerator.generatePublicKey(appleTokenHeader,
appleAuthClient.getAppleAuthPublicKey());

// identity Token에서 claims 추출
Claims claims = tokenService.getTokenClaims(identityToken, publicKey);
Claims claims = getClaimsFromIdentityToken(identityToken);

// 회원 가입 된 사용자인지 확인하기
String username = "apple "+ claims.getSubject();
Optional<Member> existData = memberRepository.findByUsername(username);

Member member;

if (existData.isEmpty()){

Member member = Member.builder()
.username(username)
.email(claims.get("email", String.class))
.role("ROLE_USER")
.isFirst(true)
.build();
member = memberConverter.toMember(username, claims);
memberRepository.save(member);

System.out.println("첫 로그인임");

jwtProvider(member, response);

return LoginResponse.builder()
.username(username)
.role(member.getRole())
.isFirst(member.getIsFirst())
.build();

}
else{

Member member = existData.get();
member = existData.get();
member.updateEmail(claims.get("email", String.class));

System.out.println("첫 로그인아님");
memberRepository.save(member);

jwtProvider(member, response);

return LoginResponse.builder()
.username(username)
.role(member.getRole())
.isFirst(member.getIsFirst())
.build();
}

return buildLoginResponse(member);
}

public void jwtProvider(Member member, HttpServletResponse response) {
Expand All @@ -111,4 +87,30 @@ public void jwtProvider(Member member, HttpServletResponse response) {
redisClient.setValue(member.getUsername(), refreshToken, 864000000L);
}

private LoginResponse buildLoginResponse(Member member) {
return LoginResponse.builder()
.username(member.getUsername())
.role(member.getRole())
.isFirst(member.getIsFirst())
.build();

}

private Claims getClaimsFromIdentityToken(String identityToken) throws InvalidKeySpecException, JsonProcessingException,AuthenticationException, NoSuchAlgorithmException{

// identity Token에서 헤더 추출
Map<String, String> appleTokenHeader = tokenService.parseHeaders(identityToken);

// 애플 서버에서 publicKey 받아온 후에 identity 토큰의 헤더와 일치하는 publicKey 만들기
PublicKey publicKey = applePublicKeyGenerator.generatePublicKey(appleTokenHeader,
appleAuthClient.getAppleAuthPublicKey());

// identity Token에서 claims 추출
return tokenService.getTokenClaims(identityToken, publicKey);




}

}

0 comments on commit ddc1bfd

Please sign in to comment.