Skip to content

Commit

Permalink
[feat] #17 OAuth2LoginSuccessHandler 생성
Browse files Browse the repository at this point in the history
  • Loading branch information
dogsub committed Jan 18, 2025
1 parent 7e2a890 commit 834645b
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.core.user.DefaultOAuth2User;

import javax.management.relation.Role;
import java.util.Collection;
import java.util.Map;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@
import com.wedit.weditapp.global.oauth2.userInfo.OAuth2UserInfo;
import lombok.Builder;
import lombok.Getter;
import org.springframework.security.core.userdetails.User;

import java.util.Map;
import java.util.UUID;

@Getter
public class OAuthAttributes {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.wedit.weditapp.global.oauth2.handler;

import com.wedit.weditapp.domain.member.domain.Member;
import com.wedit.weditapp.domain.member.domain.repository.MemberRepository;
import com.wedit.weditapp.domain.shared.MemberRole;
import com.wedit.weditapp.global.oauth2.domain.CustomOAuth2User;
import com.wedit.weditapp.global.security.jwt.JwtProvider;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Optional;

@Slf4j
@Component
@RequiredArgsConstructor
public class OAuth2LoginSuccessHandler implements AuthenticationSuccessHandler {
private final JwtProvider jwtProvider;
private final MemberRepository memberRepository;

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
log.info("OAuth2 Login 성공!");

CustomOAuth2User oAuth2User = (CustomOAuth2User) authentication.getPrincipal();
String email = oAuth2User.getEmail();

// DB에서 사용자 조회
Optional<Member> optionalMember = memberRepository.findByEmail(email);

if (optionalMember.isEmpty()) {
// 새로운 사용자인 경우 추가 정보 입력 페이지로 리다이렉트
handleNewUser(response, oAuth2User);
} else {
// 기존 사용자 로그인 성공
handleExistingUser(response, optionalMember.get());
}
}

// 새로운 사용자 처리 - 추가 정보 입력 페이지로 리다이렉트
private void handleNewUser(HttpServletResponse response, CustomOAuth2User oAuth2User) throws IOException {
String accessToken = jwtProvider.createAccessToken(oAuth2User.getEmail());
response.addHeader(jwtProvider.getAccessHeader(), "Bearer " + accessToken);

log.info("새로운 사용자: 추가 정보 입력 페이지로 리다이렉트");
response.sendRedirect("/oauth2/sign-up"); // 프론트의 회원가입 추가 정보 입력 폼으로 리다이렉트
}

// 기존 사용자 처리 - 토큰 발급 및 로그인 성공 처리
private void handleExistingUser(HttpServletResponse response, Member member) throws IOException {
log.info("기존 사용자 로그인 성공: {}", member.getEmail());

String accessToken = jwtProvider.createAccessToken(member.getEmail());
String refreshToken = member.getRefreshToken();

if (refreshToken == null || !jwtProvider.validateToken(refreshToken)) {
// Refresh Token이 없거나 유효하지 않은 경우 새로 발급
refreshToken = jwtProvider.createRefreshToken();
member.updateRefreshToken(refreshToken);
memberRepository.save(member);
log.info("새로운 Refresh Token 발급: {}", refreshToken);
}

jwtProvider.sendAccessAndRefreshToken(response, accessToken, refreshToken);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,14 @@ public void setRefreshTokenHeader(HttpServletResponse response, String refreshTo
response.setHeader(refreshHeader, BEARER + refreshToken);
}

public String getAccessHeader() {
return "Authorization";
}

public String getRefreshHeader() {
return "Authorization-Refresh";
}

// 헤더에서 AccessToken 추출
public Optional<String> extractAccessToken(HttpServletRequest request) {
return Optional.ofNullable(request.getHeader(accessHeader))
Expand Down

0 comments on commit 834645b

Please sign in to comment.