Skip to content

Commit

Permalink
feat : AuthorizationFromTokenAspect 에러 핸들링 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
nookcoder committed Jul 16, 2023
1 parent a3b3879 commit 659d250
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 111 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,24 @@
@Data
public class AwsBluePrintDto {

private String name;
private List<AwsComponentDto> components;
private List<ComponentLineDto> links;

public static List<AwsComponentDto> awsComponentDtosMapper(List<AwsComponent> awsComponentDtos) {
List<AwsComponentDto> awsComponentDtoList = new ArrayList<>();
for (AwsComponent awsComponent : awsComponentDtos) {
awsComponentDtoList.add(AwsComponentDto.mapper(awsComponent));
}
return awsComponentDtoList;
}

public static List<ComponentLineDto> componentLinkDtoListMapper(List<ComponentLine> componentLinks) {
List<ComponentLineDto> componentLinkDtoList = new ArrayList<>();
for (ComponentLine pointLink : componentLinks) {
componentLinkDtoList.add(ComponentLineDto.mapper(pointLink));
}
return componentLinkDtoList;
}
private Long id;
private String name;
private List<AwsComponentDto> components;
private List<ComponentLineDto> links;

public static List<AwsComponentDto> awsComponentDtosMapper(List<AwsComponent> awsComponentDtos) {
List<AwsComponentDto> awsComponentDtoList = new ArrayList<>();
for (AwsComponent awsComponent : awsComponentDtos) {
awsComponentDtoList.add(AwsComponentDto.mapper(awsComponent));
}
return awsComponentDtoList;
}

public static List<ComponentLineDto> componentLinkDtoListMapper(List<ComponentLine> componentLinks) {
List<ComponentLineDto> componentLinkDtoList = new ArrayList<>();
for (ComponentLine pointLink : componentLinks) {
componentLinkDtoList.add(ComponentLineDto.mapper(pointLink));
}
return componentLinkDtoList;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,17 @@ public Object applyAuthorizationFromToken(ProceedingJoinPoint joinPoint, Authori
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
String userId = getUserFromAccessToken(request.getHeader("Authorization"));

if (userId == null) {
throw new RuntimeException("유효하지 않은 토큰입니다.");
}
// 추출된 사용자 정보를 매개변수로 전달
Object[] args = joinPoint.getArgs();
args[0] = userId;

return joinPoint.proceed(args);
}


// user oauth id 추출
private String getUserFromAccessToken(String token) {
String accessToken = token.split(" ")[1];
boolean isValidate = jwtTokenProvider.validateAccessToken(accessToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
Member findMemberById(Long id);
Member findMemberById(Long id);

Member findMemberByOauthId(String oauth_id);
}
28 changes: 14 additions & 14 deletions src/main/java/com/kumofactory/cloud/member/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,22 @@
@Setter
public class Member {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String oauth_id;
private String oauthId;

private String provider;
private String provider;

@OneToMany(mappedBy = "member")
private List<AwsBluePrint> bluePrints;
@OneToMany(mappedBy = "member")
private List<AwsBluePrint> bluePrints;

// =========== 생성함수 =========== //
public static Member createMember(UserInfoDto userInfoDto) {
Member member = new Member();
member.setOauth_id(userInfoDto.id());
member.setProvider(userInfoDto.provider());
return member;
}
// =========== 생성함수 =========== //
public static Member createMember(UserInfoDto userInfoDto) {
Member member = new Member();
member.setOauthId(userInfoDto.id());
member.setProvider(userInfoDto.provider());
return member;
}
}
162 changes: 87 additions & 75 deletions src/main/java/com/kumofactory/cloud/oauth/service/OAuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
import com.kumofactory.cloud.config.OAuthProvider;
import com.kumofactory.cloud.jwt.dto.TokenDto;
import com.kumofactory.cloud.jwt.provider.JwtTokenProvider;
import com.kumofactory.cloud.member.MemberRepository;
import com.kumofactory.cloud.member.domain.Member;
import com.kumofactory.cloud.oauth.dto.UserInfoDto;
import com.kumofactory.cloud.oauth.service.github.GitHubService;
import com.kumofactory.cloud.oauth.service.google.GoogleService;

import static com.kumofactory.cloud.oauth.dto.OAuthDto.*;

import lombok.extern.slf4j.Slf4j;
Expand All @@ -25,79 +28,88 @@
@Slf4j
@RequiredArgsConstructor
public class OAuthService {
private final GoogleService googleService;
private final GitHubService githubService;

private final JwtTokenProvider jwtTokenProvider;

private TokenDto token;

public ResponseEntity<String> request(OAuthProvider provider, String code)
throws JsonProcessingException {

HttpHeaders responseHeaders = new HttpHeaders();

switch (provider) {
case GOOGLE:{
token = getAccessTokenFromGoogle(code);
break;
}
case GITHUB:{
token = getAccessTokenFromGitHub(code);
break;
}
default:{
throw new IllegalArgumentException("Unknown type of social login.");
}
}

responseHeaders.add(HttpHeaders.CONTENT_TYPE, "application/json");

ResponseCookie refreshTokenCookie = ResponseCookie
.from("refreshToken", token.getRefreshToken())
.httpOnly(true)
.path("/")
.maxAge(Duration.ofDays(365))
.build();

responseHeaders.add(HttpHeaders.SET_COOKIE, refreshTokenCookie.toString());

Map<String, String> map = new HashMap<>();
map.put("accessToken", token.getAccessToken());

return ResponseEntity.ok()
.headers(responseHeaders)
.body(new ObjectMapper().writeValueAsString(map));
}

// TODO : 중복된 코드 간소화 (getAccessTokenFromXXX)
private TokenDto getAccessTokenFromGoogle(String code)
throws JsonProcessingException{

GoogleToken accessTokenFromGoogle = googleService.requestAccessToken(code);
if(accessTokenFromGoogle != null) {

UserInfoDto userInfo = googleService.requestUserInfo(accessTokenFromGoogle.accessToken());
TokenDto token = jwtTokenProvider.create(userInfo.id());

return token;
}
assert accessTokenFromGoogle != null;
return null;
}

private TokenDto getAccessTokenFromGitHub(String code)
throws JsonProcessingException{

GitHubToken accessTokenFromGithub = githubService.requestAccessToken(code);
if(accessTokenFromGithub != null) {

UserInfoDto userInfo = githubService.requestUserInfo(accessTokenFromGithub.accessToken());
TokenDto token = jwtTokenProvider.create(userInfo.id());

return token;
}
assert accessTokenFromGithub != null;
return null;
}
private final GoogleService googleService;
private final GitHubService githubService;

private final JwtTokenProvider jwtTokenProvider;
private final MemberRepository memberRepository;

private TokenDto token;

public ResponseEntity<String> request(OAuthProvider provider, String code)
throws JsonProcessingException {

HttpHeaders responseHeaders = new HttpHeaders();

switch (provider) {
case GOOGLE: {
token = getAccessTokenFromGoogle(code);
break;
}
case GITHUB: {
token = getAccessTokenFromGitHub(code);
break;
}
default: {
throw new IllegalArgumentException("Unknown type of social login.");
}
}

responseHeaders.add(HttpHeaders.CONTENT_TYPE, "application/json");

ResponseCookie refreshTokenCookie = ResponseCookie
.from("refreshToken", token.getRefreshToken())
.httpOnly(true)
.path("/")
.maxAge(Duration.ofDays(365))
.build();

responseHeaders.add(HttpHeaders.SET_COOKIE, refreshTokenCookie.toString());

Map<String, String> map = new HashMap<>();
map.put("accessToken", token.getAccessToken());

return ResponseEntity.ok()
.headers(responseHeaders)
.body(new ObjectMapper().writeValueAsString(map));
}

// TODO : 중복된 코드 간소화 (getAccessTokenFromXXX)
private TokenDto getAccessTokenFromGoogle(String code)
throws JsonProcessingException {

GoogleToken accessTokenFromGoogle = googleService.requestAccessToken(code);
if (accessTokenFromGoogle != null) {

UserInfoDto userInfo = googleService.requestUserInfo(accessTokenFromGoogle.accessToken());
saveMember(userInfo);

return jwtTokenProvider.create(userInfo.id());
}
return null;
}

private TokenDto getAccessTokenFromGitHub(String code)
throws JsonProcessingException {

GitHubToken accessTokenFromGithub = githubService.requestAccessToken(code);
if (accessTokenFromGithub != null) {

UserInfoDto userInfo = githubService.requestUserInfo(accessTokenFromGithub.accessToken());
saveMember(userInfo);


return jwtTokenProvider.create(userInfo.id());
}
return null;
}

// 처음 가입한 member 일때만 저장
private void saveMember(UserInfoDto userInfo) {
Member member = memberRepository.findMemberByOauthId(userInfo.id());
if (member == null) {
member = Member.createMember(userInfo);
memberRepository.save(member);
}
}
}

0 comments on commit 659d250

Please sign in to comment.