Skip to content

Commit

Permalink
[BE] issue320: 기존 인증에서 githubId 가 아닌 memberId 사용하도록 리팩터링 (#327)
Browse files Browse the repository at this point in the history
* chore: 불필요한 import 구문 제거

* refactor: MemberService memberId 받도록 변경 & MemberData `memberId` 를 담아서 반환

* refactor: ReferenceRoom `memberId` 사용하도록 변경

* refactor: SearchingReferenceRoom `memberId` 사용하도록 변경

* refactor: Review `memberId` 사용하도록 변경

* refactor: Study `memberId` 사용하도록 변경

* refactor: AuthenticationPrincipal 제거

* refactor: 액세스 토큰 재발급 memberId 사용

* refactor: token 엔티티 memberId 가지도록 수정

* fix: Auth 인수 테스트 수정

* feat: 사용하지 않는 필드 제거 및 DB 조회 최소화

* refactor: orElseThrow 예외 타입 명시

* test: orElseThrow -> get 으로 수정

* refactor: 스터디장 Fixture 제거

* chore: 코드 냄새 제거

* feta: 충돌 해결

* Merge branch 'develop' of https://github.com/woowacourse-teams/2022-moamoa into refactor/320-auth-memberid

# Conflicts:
#	backend/src/main/java/com/woowacourse/moamoa/auth/config/AuthConfig.java
  • Loading branch information
tco0427 committed Sep 15, 2022
1 parent ca43e47 commit b272482
Show file tree
Hide file tree
Showing 62 changed files with 327 additions and 467 deletions.
Expand Up @@ -2,14 +2,11 @@

import com.woowacourse.moamoa.auth.controller.AuthenticatedMemberResolver;
import com.woowacourse.moamoa.auth.controller.AuthenticatedRefreshArgumentResolver;
import com.woowacourse.moamoa.auth.controller.AuthenticationArgumentResolver;
import com.woowacourse.moamoa.auth.controller.interceptor.AuthenticationInterceptor;

import com.woowacourse.moamoa.auth.controller.interceptor.PathMatcherContainer;
import com.woowacourse.moamoa.auth.controller.interceptor.PathMatcherInterceptor;
import com.woowacourse.moamoa.auth.infrastructure.TokenProvider;
import java.util.List;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -25,15 +22,13 @@
public class AuthConfig implements WebMvcConfigurer {

private final AuthenticatedRefreshArgumentResolver authenticatedRefreshArgumentResolver;
private final AuthenticationArgumentResolver authenticationArgumentResolver;
private final AuthenticatedMemberResolver authenticatedMemberResolver;

private final PathMatcherContainer pathMatcherContainer;
private final TokenProvider jwtTokenProvider;

@Override
public void addArgumentResolvers(final List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(authenticationArgumentResolver);
resolvers.add(authenticatedMemberResolver);
resolvers.add(authenticatedRefreshArgumentResolver);
}
Expand Down
Expand Up @@ -7,5 +7,5 @@

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthenticatedMember {
public @interface AuthenticatedMemberId {
}

This file was deleted.

@@ -1,7 +1,7 @@
package com.woowacourse.moamoa.auth.controller;

import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId;
import com.woowacourse.moamoa.auth.config.AuthenticatedRefresh;
import com.woowacourse.moamoa.auth.config.AuthenticationPrincipal;
import com.woowacourse.moamoa.auth.service.AuthService;
import com.woowacourse.moamoa.auth.service.response.AccessTokenResponse;
import com.woowacourse.moamoa.auth.service.response.TokensResponse;
Expand Down Expand Up @@ -35,13 +35,13 @@ public ResponseEntity<AccessTokenResponse> login(@RequestParam final String code
}

@GetMapping("/api/auth/refresh")
public ResponseEntity<AccessTokenResponse> refreshToken(@AuthenticatedRefresh Long githubId, @CookieValue String refreshToken) {
return ResponseEntity.ok().body(authService.refreshToken(githubId, refreshToken));
public ResponseEntity<AccessTokenResponse> refreshToken(@AuthenticatedRefresh Long memberId, @CookieValue String refreshToken) {
return ResponseEntity.ok().body(authService.refreshToken(memberId, refreshToken));
}

@DeleteMapping("/api/auth/logout")
public ResponseEntity<Void> logout(@AuthenticationPrincipal Long githubId) {
authService.logout(githubId);
public ResponseEntity<Void> logout(@AuthenticatedMemberId Long memberId) {
authService.logout(memberId);

return ResponseEntity.noContent().header("Set-Cookie", removeCookie().toString()).build();
}
Expand Down
@@ -1,12 +1,9 @@
package com.woowacourse.moamoa.auth.controller;

import com.woowacourse.moamoa.auth.config.AuthenticatedMember;
import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId;
import com.woowacourse.moamoa.auth.config.AuthenticationExtractor;
import com.woowacourse.moamoa.auth.infrastructure.TokenProvider;
import com.woowacourse.moamoa.common.exception.UnauthorizedException;
import com.woowacourse.moamoa.member.domain.Member;
import com.woowacourse.moamoa.member.domain.repository.MemberRepository;
import com.woowacourse.moamoa.member.service.exception.MemberNotFoundException;
import javax.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.core.MethodParameter;
Expand All @@ -20,12 +17,11 @@
@RequiredArgsConstructor
public class AuthenticatedMemberResolver implements HandlerMethodArgumentResolver {

private final MemberRepository memberRepository;
private final TokenProvider tokenProvider;

@Override
public boolean supportsParameter(final MethodParameter parameter) {
return parameter.hasParameterAnnotation(AuthenticatedMember.class);
return parameter.hasParameterAnnotation(AuthenticatedMemberId.class);
}

@Override
Expand All @@ -38,9 +34,6 @@ public Object resolveArgument(final MethodParameter parameter, final ModelAndVie
throw new UnauthorizedException("인증 타입이 올바르지 않습니다.");
}

final Long githubId = Long.valueOf(tokenProvider.getPayload(token));

final Member member = memberRepository.findByGithubId(githubId).orElseThrow(MemberNotFoundException::new);
return member.getId();
return Long.valueOf(tokenProvider.getPayload(token));
}
}

This file was deleted.

Expand Up @@ -22,12 +22,12 @@ public class Token {
private Long id;

@Column(nullable = false)
private Long githubId;
private Long memberId;

private String refreshToken;

public Token(final Long githubId, final String refreshToken) {
this(null, githubId, refreshToken);
public Token(final Long memberId, final String refreshToken) {
this(null, memberId, refreshToken);
}

public void updateRefreshToken(final String refreshToken) {
Expand Down
Expand Up @@ -6,5 +6,5 @@

public interface TokenRepository extends JpaRepository<Token, Long> {

Optional<Token> findByGithubId(Long githubId);
Optional<Token> findByMemberId(Long memberId);
}
Expand Up @@ -93,7 +93,7 @@ public boolean validateToken(final String token) {
}

@Override
public String recreationAccessToken(final Long githubId, final String refreshToken) {
public String recreationAccessToken(final Long memberId, final String refreshToken) {
Jws<Claims> claims = Jwts.parserBuilder()
.setSigningKey(key)
.build()
Expand All @@ -102,7 +102,7 @@ public String recreationAccessToken(final Long githubId, final String refreshTok
Date tokenExpirationDate = claims.getBody().getExpiration();
validateTokenExpiration(tokenExpirationDate);

return createAccessToken(githubId);
return createAccessToken(memberId);
}

private void validateTokenExpiration(Date tokenExpirationDate) {
Expand All @@ -111,11 +111,11 @@ private void validateTokenExpiration(Date tokenExpirationDate) {
}
}

private String createAccessToken(final Long githubId) {
private String createAccessToken(final Long memberId) {
final Date now = new Date();

return Jwts.builder()
.setSubject(Long.toString(githubId))
.setSubject(Long.toString(memberId))
.setIssuedAt(now)
.setExpiration(new Date(now.getTime() + validityInMilliseconds))
.signWith(key, SignatureAlgorithm.HS256)
Expand Down
Expand Up @@ -12,7 +12,7 @@ public interface TokenProvider {

boolean validateToken(final String token);

String recreationAccessToken(final Long githubId, final String refreshToken);
String recreationAccessToken(final Long memberId, final String refreshToken);

long getValidityInMilliseconds();
}
Expand Up @@ -10,6 +10,7 @@
import com.woowacourse.moamoa.auth.service.response.TokensResponse;
import com.woowacourse.moamoa.common.exception.UnauthorizedException;
import com.woowacourse.moamoa.member.service.MemberService;
import com.woowacourse.moamoa.member.service.response.MemberResponse;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -29,39 +30,37 @@ public class AuthService {
public TokensResponse createToken(final String code) {
final String accessToken = oAuthClient.getAccessToken(code);
final GithubProfileResponse githubProfileResponse = oAuthClient.getProfile(accessToken);
memberService.saveOrUpdate(githubProfileResponse.toMember());
final MemberResponse memberResponse = memberService.saveOrUpdate(githubProfileResponse.toMember());
final Long memberId = memberResponse.getId();

final Long githubId = githubProfileResponse.getGithubId();
final Optional<Token> token = tokenRepository.findByGithubId(githubId);

final TokensResponse tokenResponse = tokenProvider.createToken(githubProfileResponse.getGithubId());
final Optional<Token> token = tokenRepository.findByMemberId(memberId);
final TokensResponse tokenResponse = tokenProvider.createToken(memberId);

if (token.isPresent()) {
token.get().updateRefreshToken(tokenResponse.getRefreshToken());
return tokenResponse;
}

tokenRepository.save(new Token(githubProfileResponse.getGithubId(), tokenResponse.getRefreshToken()));
tokenRepository.save(new Token(memberId, tokenResponse.getRefreshToken()));

return tokenResponse;
}

public AccessTokenResponse refreshToken(final Long githubId, final String refreshToken) {
final Token token = tokenRepository.findByGithubId(githubId)
public AccessTokenResponse refreshToken(final Long memberId, final String refreshToken) {
final Token token = tokenRepository.findByMemberId(memberId)
.orElseThrow(TokenNotFoundException::new);

if (!token.getRefreshToken().equals(refreshToken)) {
throw new UnauthorizedException("유효하지 않은 토큰입니다.");
}

String accessToken = tokenProvider.recreationAccessToken(githubId, refreshToken);

String accessToken = tokenProvider.recreationAccessToken(memberId, refreshToken);
return new AccessTokenResponse(accessToken, tokenProvider.getValidityInMilliseconds());
}

@Transactional
public void logout(final Long githubId) {
final Token token = tokenRepository.findByGithubId(githubId)
public void logout(final Long memberId) {
final Token token = tokenRepository.findByMemberId(memberId)
.orElseThrow(TokenNotFoundException::new);

tokenRepository.delete(token);
Expand Down
@@ -1,11 +1,7 @@
package com.woowacourse.moamoa.common.config;

import com.woowacourse.moamoa.MoamoaApplication;
import java.util.List;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
Expand Down
@@ -1,12 +1,11 @@
package com.woowacourse.moamoa.member.controller;

import com.woowacourse.moamoa.auth.config.AuthenticationPrincipal;
import com.woowacourse.moamoa.member.service.response.MemberResponse;
import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId;
import com.woowacourse.moamoa.member.service.MemberService;
import com.woowacourse.moamoa.member.service.response.MemberResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
Expand All @@ -17,9 +16,9 @@ public class MemberController {

@GetMapping("/api/members/me")
public ResponseEntity<MemberResponse> getCurrentMember(
@AuthenticationPrincipal Long githubId
@AuthenticatedMemberId Long memberId
) {
MemberResponse response = memberService.getByGithubId(githubId);
MemberResponse response = memberService.getByMemberId(memberId);
return ResponseEntity.ok().body(response);
}
}
Expand Up @@ -49,12 +49,12 @@ private String countOwnerStudy() {
+ "FROM study)) as number_of_study ";
}

public Optional<MemberData> findByGithubId(final Long githubId) {
public Optional<MemberData> findByMemberId(final Long memberId) {
try {
final String sql = "SELECT github_id, username, image_url, profile_url "
final String sql = "SELECT id, username, image_url, profile_url "
+ "FROM member "
+ "WHERE member.github_id = :id";
final MemberData data = jdbcTemplate.queryForObject(sql, Map.of("id", githubId), MEMBER_DATA_ROW_MAPPER);
+ "WHERE member.id = :id";
final MemberData data = jdbcTemplate.queryForObject(sql, Map.of("id", memberId), MEMBER_DATA_ROW_MAPPER);
return Optional.of(data);
} catch (EmptyResultDataAccessException e) {
return Optional.empty();
Expand All @@ -75,11 +75,11 @@ private static RowMapper<ParticipatingMemberData> createMemberFullDataRowMapper(

private static RowMapper<MemberData> createMemberDataRowMapper() {
return (resultSet, resultNumber) -> {
Long githubId = resultSet.getLong("github_id");
Long id = resultSet.getLong("id");
String username = resultSet.getString("username");
String imageUrl = resultSet.getString("image_url");
String profileUrl = resultSet.getString("profile_url");
return new MemberData(githubId, username, imageUrl, profileUrl);
return new MemberData(id, username, imageUrl, profileUrl);
};
}
}
@@ -1,6 +1,5 @@
package com.woowacourse.moamoa.member.query.data;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
Expand All @@ -15,8 +14,7 @@
@ToString
public class MemberData {

@JsonProperty("id")
private Long githubId;
private Long id;

private String username;

Expand Down
Expand Up @@ -17,25 +17,24 @@
public class MemberService {

private final MemberRepository memberRepository;

private final MemberDao memberDao;

@Transactional
public void saveOrUpdate(final Member member) {
public MemberResponse saveOrUpdate(final Member member) {
final Optional<Member> foundMember = memberRepository.findByGithubId(member.getGithubId());

if (foundMember.isPresent()) {
foundMember.get().update(member.getUsername(), member.getImageUrl(), member.getProfileUrl());
return;
return new MemberResponse(foundMember.get());
}

memberRepository.save(member);
return new MemberResponse(memberRepository.save(member));
}

public MemberResponse getByGithubId(final Long githubId) {
final MemberData member = memberDao.findByGithubId(githubId)
public MemberResponse getByMemberId(final Long memberId) {
final MemberData member = memberDao.findByMemberId(memberId)
.orElseThrow(MemberNotFoundException::new);
return new MemberResponse(member.getGithubId(), member.getUsername(),
return new MemberResponse(member.getId(), member.getUsername(),
member.getProfileUrl(), member.getImageUrl());
}
}

0 comments on commit b272482

Please sign in to comment.