Skip to content

Commit

Permalink
feat : 구글 로그인 구현 완료 #64
Browse files Browse the repository at this point in the history
  • Loading branch information
wooni89 committed Oct 24, 2023
1 parent 7e6e328 commit a595b29
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public enum AuthException implements BaseErrorCode {
INVALID_TOKEN_ERROR(UNAUTHORIZED.value(), "Token_403_2", "토큰이 만료되었거나 형식에 맞지않은 토큰입니다."),
TOKEN_NOT_FOUND_ERROR(NOT_FOUND.value(), "Token_404_1", "토큰을 찾을 수 없습니다."),
USER_NOT_FOUND_ERROR(NOT_FOUND.value(), "User_404_1", "유저를 찾을 수 없습니다."),
PASSWORD_INCORRECT_ERROR(NOT_FOUND.value(), "User_404_2", "해당 비밀번호를 가진 유저를 찾을 수 없습니다.")
PASSWORD_INCORRECT_ERROR(NOT_FOUND.value(), "User_404_2", "비밀번호가 다릅니다 다시 입력해 주세요.")
;

private final Integer statusCode;
Expand Down
Empty file.
66 changes: 23 additions & 43 deletions src/main/java/HookKiller/server/auth/service/AuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,14 @@
import HookKiller.server.auth.dto.request.AuthRequest;
import HookKiller.server.auth.dto.response.AuthResponse;
import HookKiller.server.auth.dto.response.OAuthResponse;
import HookKiller.server.auth.dto.response.OauthLoginLinkResponse;
import HookKiller.server.auth.dto.response.OauthTokenResponse;
import HookKiller.server.auth.exception.PasswordIncorrectException;
import HookKiller.server.auth.exception.UserNotFoundException;
import HookKiller.server.auth.helper.KakaoOauthHelper;
import HookKiller.server.auth.helper.OauthHelper;
import HookKiller.server.auth.helper.TokenGenerateHelper;
import HookKiller.server.common.dto.AccessTokenDetail;
import HookKiller.server.common.dto.MailRequest;
import HookKiller.server.common.service.MailHelper;
import HookKiller.server.jwt.JwtTokenProvider;
import HookKiller.server.properties.KakaoOauthProperties;
import HookKiller.server.outer.api.oauth.client.GoogleTokenInfo;
import HookKiller.server.user.entity.User;
import HookKiller.server.user.repository.UserRepository;
import HookKiller.server.user.type.LoginType;
Expand All @@ -36,12 +33,10 @@ public class AuthService {

private final JwtTokenProvider jwtTokenProvider;
private final UserRepository userRepository;
private final KakaoOauthProperties kakaoOauthProperties;
private final KakaoOauthHelper kakaoOauthHelper;
private final OauthHelper oauthHelper;
private final TokenGenerateHelper tokenGenerateHelper;
private final MailHelper mailHelper;
private static final String KAKAO_OAUTH_QUERY_STRING =
"/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code";
private final GoogleTokenInfo googleTokenInfo;

public ResponseEntity<AuthResponse> loginExecute(AuthRequest request) {
User user = userRepository.findByEmail(request.getEmail()).orElseThrow(() -> UserNotFoundException.EXCEPTION);
Expand All @@ -64,27 +59,9 @@ public ResponseEntity<AuthResponse> loginExecute(AuthRequest request) {
return ResponseEntity.ok(res);
}

public boolean loginExecuteTest(String accessToken) {
log.info("loginExecuteTest 들어옴!");
AccessTokenDetail accessTokenDetail = jwtTokenProvider.parseAccessToken(accessToken);
log.info(accessTokenDetail.toString());
return userRepository.findById(accessTokenDetail.getUserId()).isPresent();
}

// 카카오 로그인을 할 수 있게 하는 링크 받기
public OauthLoginLinkResponse getKakaoOauthLink(String referer) {
return new OauthLoginLinkResponse(
kakaoOauthProperties.getKakaoBaseUrl()
+ String.format(
KAKAO_OAUTH_QUERY_STRING,
kakaoOauthProperties.getKakaoClientId(),
kakaoOauthProperties.getKakaoRedirectUrl()
));
}

public OAuthResponse registerUserKakaoCode(String code) {
String idToken = kakaoOauthHelper.getOauthTokenTest(code).getIdToken();
OIDCUserInfo userInfo = kakaoOauthHelper.getOauthInfoByIdToken(idToken);
String idToken = oauthHelper.getOauthTokenKakao(code).getIdToken();
OIDCUserInfo userInfo = oauthHelper.getKakaoInfoByIdToken(idToken);

User user =
userRepository.findByEmail(userInfo.getEmail())
Expand All @@ -105,21 +82,24 @@ public OAuthResponse registerUserKakaoCode(String code) {
return tokenGenerateHelper.execute(user);
}

// 카카오 로그인 후 토큰 받기
public OauthTokenResponse getCredentialFromKaKao(String code, String referer) {
log.info("referer : {}", referer);
log.info("referer + 리다이렉트 : {}", referer + "/auth/oauth/kakao");
return OauthTokenResponse.from(
kakaoOauthHelper.getOauthToken(code, referer)
);
}
public OAuthResponse registerGoogleUser(String code) {
String accessToken = oauthHelper.getOauthTokenGoogle(code).getAccessToken();
OIDCUserInfo userInfo = oauthHelper.getGoogleInfoById(googleTokenInfo.googleUserInfo(accessToken));

// 받아온 idToken으로 우리 서비스에 로그인 할 수 있는 accessToken 받아오기
public OAuthResponse loginUserByIdToken(String idToken) {
// idToken으로 유저 정보 찾아오기
OIDCUserInfo oidcUserInfo = kakaoOauthHelper.getOauthInfoByIdToken(idToken);
User user = userRepository.findByEmail(oidcUserInfo.getEmail()).orElseThrow(() -> UserNotFoundException.EXCEPTION);
// tokenGenerateHelper에 찾아온 유저 넣어서 execute
User user =
userRepository.findByEmail(userInfo.getEmail())
.orElseGet(() ->
userRepository.findByEmail(userInfo.getEmail())
.orElse(userRepository.save(User.builder()
.email(userInfo.getEmail())
.password(UUID.randomUUID().toString())
.nickName(userInfo.getName())
.thumbnail(userInfo.getPicture())
.loginType(LoginType.GOOGLE)
.role(UserRole.USER)
.status(Status.ACTIVE)
.oauthInfo(userInfo.getOauthInfo())
.build())));
return tokenGenerateHelper.execute(user);
}
}
1 change: 1 addition & 0 deletions src/main/java/HookKiller/server/jwt/JwtOIDCProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.springframework.stereotype.Component;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package HookKiller.server.outer.api.oauth.config;

public class GoogleAuthFeginConfig {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package HookKiller.server.outer.api.oauth.config;

public class GoogleInfoClientConfig {
}
2 changes: 1 addition & 1 deletion src/main/resources/application-local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
hook:
db:
url: db-it7f7-kr.vpc-pub-cdb.ntruss.com
database:
database: jw
username: hooklocal
password: hooklocal1234!
port: 3306
Expand Down

0 comments on commit a595b29

Please sign in to comment.