Skip to content

Commit

Permalink
Merge pull request #142 from Me1tingPot/feature/#141
Browse files Browse the repository at this point in the history
[Feature] ์• ํ”Œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„
  • Loading branch information
JangYouJung committed Aug 6, 2024
2 parents 3e68a16 + 1d3962a commit 8fb9cf4
Show file tree
Hide file tree
Showing 9 changed files with 67 additions and 210 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ dependencies {

//Apple Login
implementation 'com.nimbusds:nimbus-jose-jwt:3.10'
implementation 'org.bouncycastle:bcpkix-jdk18on:1.72'

//Json
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/meltingpot/server/auth/oauth/OAuthDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package meltingpot.server.auth.oauth;

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class OAuthDto {
private String email;
private String nickname;

}

This file was deleted.

11 changes: 0 additions & 11 deletions src/main/java/meltingpot/server/auth/oauth/kakao/KakaoDto.java

This file was deleted.

137 changes: 0 additions & 137 deletions src/main/java/meltingpot/server/auth/oauth/kakao/KakaoService.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public AccountResponseDto signup(SignupRequestDto signupRequest) {
.birth(signupRequest.birth())
.nationality(signupRequest.nationality())
.isQuit(false)
.oAuthType(OAuthType.NONE)
.OAuthType(OAuthType.NONE)
.build();

account.setProfileImages(signupRequest.profileImages().stream().map(
Expand Down
99 changes: 49 additions & 50 deletions src/main/java/meltingpot/server/auth/service/OAuthService.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package meltingpot.server.auth.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import meltingpot.server.auth.controller.dto.OAuthSignInRequestDto;
import meltingpot.server.auth.controller.dto.OAuthSignupRequestDto;
import meltingpot.server.auth.controller.dto.ProfileImageRequestDto;
import meltingpot.server.auth.oauth.OAuthUserDetails;
import meltingpot.server.auth.oauth.kakao.KakaoDto;
import meltingpot.server.auth.oauth.kakao.KakaoService;
import meltingpot.server.auth.oauth.OAuthDto;
import meltingpot.server.auth.service.dto.OAuthSignInResponseDto;
import meltingpot.server.config.TokenProvider;
import meltingpot.server.domain.entity.*;
import meltingpot.server.domain.entity.enums.Gender;
import meltingpot.server.domain.entity.enums.OAuthType;
import meltingpot.server.domain.repository.AccountPushTokenRepository;
import meltingpot.server.domain.repository.AccountRepository;
import meltingpot.server.domain.repository.RefreshTokenRepository;
Expand All @@ -27,22 +27,18 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashSet;
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.Set;
import java.util.*;

@Slf4j
@RequiredArgsConstructor
@Service
@EnableWebSecurity
public class OAuthService {
private final AccountRepository accountRepository;
private final KakaoService kakaoService;
private final TokenProvider tokenProvider;
private final RefreshTokenRepository refreshTokenRepository;
private final AccountPushTokenRepository accountPushTokenRepository;

private final ObjectMapper objectMapper = new ObjectMapper();

// SNS ํšŒ์› ๊ฐ€์ž…
@Transactional
Expand Down Expand Up @@ -90,7 +86,7 @@ public OAuthSignInResponseDto oauthSignup(OAuthSignupRequestDto signupRequest) {
.birth(signupRequest.birth())
.nationality(signupRequest.nationality())
.isQuit(false)
.oAuthType(signupRequest.OauthType())
.OAuthType(signupRequest.OauthType())
.build();

account.setProfileImages(signupRequest.profileImages().stream().map(
Expand Down Expand Up @@ -126,49 +122,27 @@ public OAuthSignInResponseDto oauthSignup(OAuthSignupRequestDto signupRequest) {
@Transactional
public OAuthSignInResponseDto SNSLogin(OAuthSignInRequestDto request) throws Exception {

if(request.type() == OAuthType.KAKAO) {

/* * * * RestAPI ๋ฒ„์ „ * * * /
// ์นด์นด์˜ค ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ
KaKaoTokenDto tokenDto = kakaoService.getKakaoToken(request.token());
// ์นด์นด์˜ค ์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
KakaoDto kakaoDto = kakaoService.getUserInfoWithToken(request.token());
* * * * * * * * * * * * */

// SDK ๋ฒ„์ „: ์•„์ด๋””ํ† ํฐ์œผ๋กœ ์œ ์ € ์ •๋ณด ํŒŒ์‹ฑํ•ด์˜ค๊ธฐ
KakaoDto kakaoDto = kakaoService.getUserInfoFromIdToken(request.token());

// ์ด๋ฏธ ๊ฐ€์ž…ํ•œ ํšŒ์›์ธ์ง€ ํ™•์ธ
Optional<Account> account = accountRepository.findByUsernameAndIsQuitIsFalse(kakaoDto.getEmail());
if (account.isEmpty()) {
OAuthDto oAuthDto = getUserInfoFromIdToken(request.token());

// ํšŒ์› ๊ฐ€์ž…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
return OAuthSignInResponseDto.builder()
.register_required(true)
.nickName(kakaoDto.getNickname())
.email(kakaoDto.getEmail())
.tokenDto(null)
.build();
// ์ด๋ฏธ ๊ฐ€์ž…ํ•œ ํšŒ์›์ธ์ง€ ํ™•์ธ
Optional<Account> account = accountRepository.findByUsernameAndIsQuitFalseAndOAuthType(oAuthDto.getEmail(), request.type());
if (account.isEmpty()) {

} else {
// ํšŒ์› ๊ฐ€์ž…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
return OAuthSignInResponseDto.builder()
.register_required(true)
.nickName(oAuthDto.getNickname())
.email(oAuthDto.getEmail())
.tokenDto(null)
.build();

return OAuthSignInResponseDto.builder().
register_required(false)
.nickName(kakaoDto.getNickname())
.email(kakaoDto.getEmail())
.tokenDto(setSecurityContext(account.get(), request.push_token()))
.build();
}
}
// else if(request.type() == OAuthType.APPLE) {
//
// }
// else if(request.type() == OAuthType.GOOGLE) {
//
// }
else {
throw new NoSuchElementException();
} else {
return OAuthSignInResponseDto.builder().
register_required(false)
.nickName(oAuthDto.getNickname())
.email(oAuthDto.getEmail())
.tokenDto(setSecurityContext(account.get(), request.push_token()))
.build();
}

}
Expand Down Expand Up @@ -208,4 +182,29 @@ public TokenDto setSecurityContext(Account account, String pushToken ){

}

public OAuthDto getUserInfoFromIdToken(String idToken) throws Exception {

// ์˜จ์  ๋ถ„๋ฆฌ
String[] parts = idToken.split("\\.");
if (parts.length != 3) {
throw new java.lang.IllegalArgumentException("Invalid IdToken");
}

// Payload ๋””์ฝ”๋”ฉ
String payload = parts[1];
String decodedPayload = new String(Base64.getDecoder().decode(payload));

// JSON ํŒŒ์‹ฑ
JsonNode jsonNode = objectMapper.readTree(decodedPayload);

// email๊ณผ nickname ์ถ”์ถœ
String email = jsonNode.path("email").asText(null);
String nickname = jsonNode.path("nickname").asText(null);

return OAuthDto.builder()
.email(email)
.nickname(nickname).build();

}

}
3 changes: 2 additions & 1 deletion src/main/java/meltingpot/server/domain/entity/Account.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ public class Account extends BaseEntity {

private Boolean isQuit; // ํƒˆํ‡ด ์—ฌ๋ถ€

private OAuthType oAuthType;
@Enumerated(EnumType.STRING)
private OAuthType OAuthType;

@OneToMany(mappedBy = "account", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Builder.Default
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package meltingpot.server.domain.repository;

import meltingpot.server.domain.entity.Account;
import meltingpot.server.domain.entity.enums.OAuthType;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface AccountRepository extends JpaRepository<Account, Long> {
Optional<Account> findByUsernameAndIsQuitIsFalse(String username);
Optional<Account> findByUsernameAndIsQuitFalseAndOAuthType(String username, OAuthType oAuthType);
Optional<Account> findByUsername(String name);

boolean existsByUsername(String username);
Expand Down

0 comments on commit 8fb9cf4

Please sign in to comment.