Skip to content

Commit

Permalink
apple login merge
Browse files Browse the repository at this point in the history
  • Loading branch information
bongsh0112 committed Dec 16, 2023
2 parents 9f21fd0 + 4e391b3 commit e99539e
Show file tree
Hide file tree
Showing 34 changed files with 699 additions and 204 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -15,8 +18,10 @@
import org.springframework.web.bind.annotation.RestController;
import tify.server.api.auth.model.response.AuthResponse;
import tify.server.api.auth.model.response.OauthLoginLinkResponse;
import tify.server.api.auth.model.response.OauthRefreshResponse;
import tify.server.api.auth.model.response.OauthTokenResponse;
import tify.server.api.auth.model.response.UserCanRegisterResponse;
import tify.server.api.auth.model.response.UserRefreshTokenResponse;
import tify.server.api.auth.service.LoginUseCase;
import tify.server.api.auth.service.LogoutUseCase;
import tify.server.api.auth.service.SignUpUseCase;
Expand Down Expand Up @@ -72,8 +77,8 @@ public OauthTokenResponse getKakaoCredentialInfo(

@Operation(summary = "발급받은 idToken을 통해 회원가입")
@PostMapping("/oauth/kakao/register")
public AuthResponse registerUser(@RequestParam("id_token") String token) {
return signUpUseCase.registerUserByOICDToken(token);
public AuthResponse registerUserByKakao(@RequestParam("id_token") String token) {
return signUpUseCase.registerUserByKakaoOICDToken(token);
}

@Deprecated
Expand All @@ -85,14 +90,14 @@ public AuthResponse registerUserForTest(@RequestParam String code) {

@Operation(summary = "id token 이용해서 로그인")
@PostMapping("/oauth/kakao/login")
public AuthResponse loginUser(@RequestParam String idToken) {
return loginUseCase.execute(idToken);
public AuthResponse loginUserByKakao(@RequestParam String idToken) {
return loginUseCase.executeByKakao(idToken);
}

@Operation(summary = "유저가 회원가입 되어있는지 여부 조회")
@GetMapping("/oauth/register/valid")
public UserCanRegisterResponse getUserCanRegister(@RequestParam String idToken) {
return signUpUseCase.retrieveUserCanRegister(idToken);
@Operation(summary = "유저가 카카오 회원가입 되어있는지 여부 조회")
@GetMapping("/oauth/register/valid/kakao")
public UserCanRegisterResponse getUserCanRegisterByKakao(@RequestParam String idToken) {
return signUpUseCase.retrieveUserCanRegisterByKakao(idToken);
}

@Operation(summary = "리프레시 토큰으로 accessToken 재발급")
Expand All @@ -108,5 +113,66 @@ public void logout(HttpServletRequest req) {
logoutUseCase.execute(req.getHeader("Authorization"));
}

@Operation(summary = "apple oauth 링크발급", description = "apple 링크를 받아볼수 있습니다.")
@GetMapping("/oauth/apple/link")
public OauthLoginLinkResponse getAppleLoginLink(
@RequestHeader(required = false) String referer,
@RequestHeader(required = false) String host) {

// dev, production 환경에서
if (referer.contains(host)) {
log.info("/oauth/apple/" + host);
String format = String.format("https://%s/", host);
return signUpUseCase.getAppleOauthLink(format);
}
return signUpUseCase.getAppleOauthLink(referer);
}

@Operation(summary = "apple code를 통해 토큰 발급")
@GetMapping("/oauth/apple")
public OauthTokenResponse getAppleCredentialInfo(
@RequestParam String code,
@RequestHeader(required = false) String referer,
@RequestHeader(required = false) String host)
throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {

return signUpUseCase.getCredentialFromApple(code);
}

@Operation(summary = "apple에서 발급한 idToken, refreshToken 이용하여 회원가입")
@GetMapping("/oauth/apple/register")
public AuthResponse registerUserByApple(
@RequestParam("id_token") String idToken,
@RequestParam("refresh_token") String refreshToken,
@RequestHeader(required = false) String referer,
@RequestHeader(required = false) String host) {
return signUpUseCase.registerUserByAppleOIDCToken(idToken, refreshToken);
}

@Operation(summary = "apple id token으로 로그인")
@PostMapping("oauth/apple/login")
public AuthResponse loginUserByApple(@RequestParam String idToken) {
return loginUseCase.executeByApple(idToken);
}

@Operation(summary = "유저가 애플 회원가입 되어있는지 여부 조회")
@GetMapping("/oauth/register/valid/apple")
public UserCanRegisterResponse getUserCanRegisterByApple(@RequestParam String idToken) {
return signUpUseCase.retrieveUserCanRegisterByApple(idToken);
}

@Operation(summary = "유저의 apple refresh token 조회")
@GetMapping("/oauth/apple/refresh")
public UserRefreshTokenResponse getAppleRefreshToken(@RequestParam Long userId) {
return loginUseCase.getAppleRefreshToken(userId);
}

@Operation(summary = "기존 refresh token으로 access token 얻어 세션 유지")
@GetMapping("/oauth/apple/valid")
public OauthRefreshResponse validateRefreshToken(@RequestParam String refreshToken)
throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
return loginUseCase.getCredentialFromApple(refreshToken);
}

// Todo: 회원 탈퇴 구현
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package tify.server.api.auth.model.response;


import lombok.Builder;
import lombok.Getter;
import tify.server.infrastructure.outer.api.oauth.dto.AppleRefreshResponse;

@Getter
@Builder
public class OauthRefreshResponse {

private String accessToken;

private String tokenType;

private Long expiresIn;

public static OauthRefreshResponse from(AppleRefreshResponse response) {
return OauthRefreshResponse.builder()
.accessToken(response.getAccessToken())
.tokenType(response.getTokenType())
.expiresIn(response.getExpiresIn())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import lombok.Builder;
import lombok.Getter;
import tify.server.infrastructure.outer.api.oauth.dto.AppleTokenResponse;
import tify.server.infrastructure.outer.api.oauth.dto.KakaoTokenResponse;

@Getter
Expand All @@ -20,4 +21,12 @@ public static OauthTokenResponse from(KakaoTokenResponse kakaoTokenResponse) {
.idToken(kakaoTokenResponse.getIdToken())
.build();
}

public static OauthTokenResponse from(AppleTokenResponse appleTokenResponse) {
return OauthTokenResponse.builder()
.accessToken(appleTokenResponse.getAccessToken())
.refreshToken(appleTokenResponse.getRefreshToken())
.idToken(appleTokenResponse.getIdToken())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package tify.server.api.auth.model.response;


import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class UserRefreshTokenResponse {

private String appleRefreshToken;
}
25 changes: 24 additions & 1 deletion Api/src/main/java/tify/server/api/auth/service/LoginUseCase.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package tify.server.api.auth.service;


import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import lombok.RequiredArgsConstructor;
import tify.server.api.auth.model.response.AuthResponse;
import tify.server.api.auth.model.response.OauthRefreshResponse;
import tify.server.api.auth.model.response.UserRefreshTokenResponse;
import tify.server.api.auth.service.helper.AppleOauthHelper;
import tify.server.api.auth.service.helper.KakaoOauthHelper;
import tify.server.api.auth.service.helper.TokenGenerateHelper;
import tify.server.core.annotation.UseCase;
Expand All @@ -22,12 +28,18 @@ public class LoginUseCase {
private final RefreshTokenAdaptor refreshTokenAdaptor;
private final JwtTokenProvider jwtTokenProvider;
private final UserAdaptor userAdaptor;
private final AppleOauthHelper appleOauthHelper;

public AuthResponse execute(String idToken) {
public AuthResponse executeByKakao(String idToken) {
User user = userDomainService.loginUser(kakaoOauthHelper.getOauthInfoByIdToken(idToken));
return tokenGenerateHelper.execute(user);
}

public AuthResponse executeByApple(String idToken) {
User user = userDomainService.loginUser(appleOauthHelper.getOauthInfoByIdToken(idToken));
return tokenGenerateHelper.execute(user);
}

public AuthResponse reissue(String refreshToken) {

Long refreshUserId =
Expand All @@ -39,4 +51,15 @@ public AuthResponse reissue(String refreshToken) {
userDomainService.loginUser(user.getOauthInfo());
return tokenGenerateHelper.execute(user);
}

public OauthRefreshResponse getCredentialFromApple(String refreshToken)
throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
return appleOauthHelper.validateRefreshToken(refreshToken);
}

public UserRefreshTokenResponse getAppleRefreshToken(Long userId) {
return UserRefreshTokenResponse.builder()
.appleRefreshToken(userAdaptor.query(userId).getAppleRefreshToken())
.build();
}
}
34 changes: 32 additions & 2 deletions Api/src/main/java/tify/server/api/auth/service/SignUpUseCase.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package tify.server.api.auth.service;


import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import tify.server.api.auth.model.KakaoUserInfoDto;
import tify.server.api.auth.model.response.AuthResponse;
import tify.server.api.auth.model.response.OauthLoginLinkResponse;
import tify.server.api.auth.model.response.OauthTokenResponse;
import tify.server.api.auth.model.response.UserCanRegisterResponse;
import tify.server.api.auth.service.helper.AppleOauthHelper;
import tify.server.api.auth.service.helper.KakaoOauthHelper;
import tify.server.api.auth.service.helper.OIDCHelper;
import tify.server.api.auth.service.helper.TokenGenerateHelper;
Expand All @@ -27,6 +32,8 @@ public class SignUpUseCase {

private final KakaoOauthHelper kakaoOauthHelper;

private final AppleOauthHelper appleOauthHelper;

private final UserDomainService userDomainService;

public OauthLoginLinkResponse getKaKaoOauthLinkTest() {
Expand All @@ -37,7 +44,11 @@ public OauthLoginLinkResponse getKaKaoOauthLink(String referer) {
return new OauthLoginLinkResponse(kakaoOauthHelper.getKaKaoOauthLink(referer));
}

public AuthResponse registerUserByOICDToken(String idToken) {
public OauthLoginLinkResponse getAppleOauthLink(String referer) {
return new OauthLoginLinkResponse(appleOauthHelper.getAppleOauthLink(referer));
}

public AuthResponse registerUserByKakaoOICDToken(String idToken) {

OauthInfo oauthInfo = kakaoOauthHelper.getOauthInfoByIdToken(idToken);
User user = userDomainService.registerUser(oauthInfo);
Expand All @@ -60,13 +71,32 @@ public OauthTokenResponse getCredentialFromKaKao(String code, String referer) {
return OauthTokenResponse.from(kakaoOauthHelper.getOauthToken(code, referer));
}

public OauthTokenResponse getCredentialFromApple(String code)
throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
return OauthTokenResponse.from(appleOauthHelper.getOauthToken(code));
}

public OauthTokenResponse getCredentialFromKaKaoTest(String code) {

return OauthTokenResponse.from(kakaoOauthHelper.getOauthTokenTest(code));
}

public UserCanRegisterResponse retrieveUserCanRegister(String idToken) {
public UserCanRegisterResponse retrieveUserCanRegisterByKakao(String idToken) {
OauthInfo oauthInfo = kakaoOauthHelper.getOauthInfoByIdToken(idToken);
return UserCanRegisterResponse.from(userDomainService.userCanRegister(oauthInfo));
}

public UserCanRegisterResponse retrieveUserCanRegisterByApple(String idToken) {
OauthInfo oauthInfo = appleOauthHelper.getOauthInfoByIdToken(idToken);
return UserCanRegisterResponse.from(userDomainService.userCanRegister(oauthInfo));
}

@Transactional
public AuthResponse registerUserByAppleOIDCToken(String idToken, String refreshToken) {
OauthInfo oauthInfo = appleOauthHelper.getOauthInfoByIdToken(idToken);
User user = userDomainService.registerUser(oauthInfo);
user.updateAppleRefreshToken(refreshToken);

return tokenGenerateHelper.execute(user);
}
}
Loading

0 comments on commit e99539e

Please sign in to comment.