Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
a59d722
Update application.yml
chuman0216 Jun 9, 2025
dd6a193
Update application.yml
chuman0216 Jun 9, 2025
c25f360
Update application.yml
chuman0216 Jun 9, 2025
efc122f
Update application.yml
chuman0216 Jun 9, 2025
a251a54
Update application.yml
chuman0216 Jun 9, 2025
845f3c2
Update application.yml
chuman0216 Jun 9, 2025
10f3d31
Update application.yml
chuman0216 Jun 9, 2025
2452bea
Update application.yml
chuman0216 Jun 9, 2025
1142fe3
Update application.yml
chuman0216 Jun 9, 2025
d686bb5
Update MemberServiceFeignClient.java
Mongjo Jun 16, 2025
cb77c51
Update MemberServiceFeignClient.java
Mongjo Jun 16, 2025
be0da1d
[FIX] [BVFH-106] fix login api response
Mongjo Jun 16, 2025
b93d621
Merge pull request #16 from Spharos-team1/BVFH-106-sign-in
Mongjo Jun 16, 2025
9fe8bdd
[CHORE] [BVFH-106] change token claims name
Mongjo Jun 16, 2025
dc2ee8b
Merge pull request #18 from Spharos-team1/BVFH-106-sign-in
Mongjo Jun 16, 2025
a970e57
[FIX] fix authrepository method type to optional
Mongjo Jul 1, 2025
f3754e7
Merge pull request #19 from Spharos-team1/BVFH-106-sign-in
Mongjo Jul 1, 2025
ab263ad
[FIX] add EnableJpaAuditing annotation
Mongjo Jul 1, 2025
607c0db
Merge pull request #20 from Spharos-team1/BVFH-106-sign-in
Mongjo Jul 1, 2025
b184a76
[FiX] [BVFH-106] fix swagger config
Mongjo Jul 4, 2025
49441e6
Merge pull request #21 from Spharos-team1/BVFH-106-sign-in
Mongjo Jul 4, 2025
b5855f2
[FiX] [BVFH-106] fix get signKey
Mongjo Jul 7, 2025
29a962f
Merge pull request #22 from Spharos-team1/BVFH-106-sign-in
chuman0216 Jul 7, 2025
83cc835
[FEAT] [BVFH-106] add member-service feign client fallback
Mongjo Jul 8, 2025
1b7af90
Merge pull request #23 from Spharos-team1/BVFH-106-sign-in
Mongjo Jul 8, 2025
edc7e59
[FIX] [BVFH-106] add index and fix yml
Mongjo Jul 9, 2025
5fd4dc1
Merge pull request #24 from Spharos-team1/BVFH-106-sign-in
Mongjo Jul 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableFeignClients(basePackages = "com.chalnakchalnak.authservice.adapter.out.http")
@EnableJpaAuditing
public class AuthserviceApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public SignInRequestDto toSignInRequestDto(SignInRequestVo signInRequestVo) {

public SignInResponseVo toSignInResponseVo(SignInResponseDto signInResponseDto) {
return SignInResponseVo.builder()
.memberUuid(signInResponseDto.getMemberUuid())
.accessToken(signInResponseDto.getAccessToken())
.refreshToken(signInResponseDto.getRefreshToken())
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

@RestController
@RequestMapping("/api/v1/auth")
@RequiredArgsConstructor
Expand Down Expand Up @@ -119,4 +122,5 @@ public void resetPassword(
authVoMapper.toResetPasswordRequestDto(resetPasswordRequestVo)
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
@Getter
public class SignInResponseVo {

private String memberUuid;
private String accessToken;
private String refreshToken;

@Builder
public SignInResponseVo(String accessToken, String refreshToken) {
public SignInResponseVo(String memberUuid, String accessToken, String refreshToken) {
this.memberUuid = memberUuid;
this.accessToken = accessToken;
this.refreshToken = refreshToken;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.chalnakchalnak.authservice.adapter.out.http.feign.member;

import com.chalnakchalnak.authservice.application.port.dto.feign.member.CreateMemberRequestDto;
import com.chalnakchalnak.authservice.common.exception.BaseException;
import com.chalnakchalnak.authservice.common.response.BaseResponseStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class MemberServiceFallbackFactory implements FallbackFactory<MemberServiceFeignClient> {

@Override
public MemberServiceFeignClient create(Throwable cause) {
return new MemberServiceFeignClient() {
@Override
public void createMember(CreateMemberRequestDto dto) {
// μ˜ˆμ™Έ 핸듀링 둜직
throw new BaseException(BaseResponseStatus.MEMBER_SERVICE_CREATE_ERROR);
}

@Override
public Boolean existsByNickname(String nickname) {
throw new BaseException(BaseResponseStatus.MEMBER_SERVICE_EXISTS_NICKNAME_ERROR);
}
};
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,17 @@
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

//@FeignClient(name = "member-service", url = "http://member-service.default.svc.cluster.local:8080")
@FeignClient(name = "member-service", path = "api/v1/member", url = "http://localhost:8081")
@FeignClient(
name = "member-service",
path = "api/v1/member",
url = "${feign.client.member-service.url}",
fallbackFactory = MemberServiceFallbackFactory.class
)
public interface MemberServiceFeignClient extends MemberServicePort {

@PostMapping("/sign-up")
void createMember(@RequestBody CreateMemberRequestDto createMemberRequestDto);

@GetMapping("/exists/nickname/{nickname}")
Boolean existsByNickname(@PathVariable String nickname);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@
import lombok.NoArgsConstructor;

@Entity
@Table(name = "auth")
@Table(
name = "auth",
indexes = {
@Index(name = "idx_member_id", columnList = "member_id"),
@Index(name = "idx_phone_number", columnList = "phone_number")
}
)
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class AuthEntity extends BaseEntity {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public interface AuthJpaRepository extends JpaRepository<AuthEntity, String> {

Boolean existsByMemberId(String memberId);
Boolean existsByPhoneNumber(String phoneNumber);
AuthEntity findByMemberId(String memberId);
AuthEntity findMemberIdByPhoneNumber(String phoneNumber);
Optional<AuthEntity> findByMemberId(String memberId);
Optional<AuthEntity> findMemberIdByPhoneNumber(String phoneNumber);
Optional<AuthEntity> findByPhoneNumber(String phoneNumber);
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,15 @@ public Boolean existsByPhoneNumber(String phoneNumber) {
@Override
public Optional<AuthResponseDto> findByMemberId(String memberId) {

return Optional.ofNullable(authEntityMapper.toAuthResponseDto(authJpaRepository.findByMemberId(memberId)));
return authJpaRepository.findByMemberId(memberId)
.map(authEntityMapper::toAuthResponseDto);
}

@Override
public GetMemberIdResponseDto findMemberIdByPhoneNumber(GetMemberIdDto getMemberIdDto) {
public Optional<GetMemberIdResponseDto> findMemberIdByPhoneNumber(GetMemberIdDto getMemberIdDto) {

return authEntityMapper.toGetMemberIdResponseDto(
authJpaRepository.findMemberIdByPhoneNumber(getMemberIdDto.getPhoneNumber())
);
return authJpaRepository.findMemberIdByPhoneNumber(getMemberIdDto.getPhoneNumber())
.map(authEntityMapper::toGetMemberIdResponseDto);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public String getMemberUuidByToken(String token) {
public SignInResponseDto generateAllToken(String memberUuid) {

return authMapper.toSignInResponseDto(
memberUuid,
jwtTokenProvider.generateAccessToken("member", memberUuid),
jwtTokenProvider.generateRefreshToken("member", memberUuid)
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public String generateAccessToken(String role, String memberUuid) {
.signWith(getSignKey())
.claim("token_type", "access")
.claim("role", role)
.claim("uuid", memberUuid)
.claim("memberUuid", memberUuid)
.issuedAt(now)
.expiration(expiration)
.compact();
Expand All @@ -88,7 +88,7 @@ public String generateRefreshToken(String role, String memberUuid) {
.signWith(getSignKey())
.claim("token_type", "refresh")
.claim("role", role)
.claim("uuid", memberUuid)
.claim("memberUuid", memberUuid)
.issuedAt(now)
.expiration(expiration)
.compact();
Expand Down Expand Up @@ -124,8 +124,8 @@ public String extractRole(String token) {
*/
public Key getSignKey() {
String secret = Objects.requireNonNull(env.getProperty("JWT.secret-key"));
byte[] decodedKey = Base64.getDecoder().decode(secret);
// byte[] decodedKey = Base64.getDecoder().decode(secret);

return Keys.hmacShaKeyFor(decodedKey);
return Keys.hmacShaKeyFor(secret.getBytes());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,9 @@ public SignInDto toSignInDto(AuthDomain authDomain) {
.build();
}

public SignInResponseDto toSignInResponseDto(String accessToken, String refreshToken) {
public SignInResponseDto toSignInResponseDto(String memberUuid, String accessToken, String refreshToken) {
return SignInResponseDto.builder()
.memberUuid(memberUuid)
.accessToken(accessToken)
.refreshToken(refreshToken)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@

@Getter
public class SignInResponseDto {

private String memberUuid;
private String accessToken;
private String refreshToken;

@Builder
public SignInResponseDto(String accessToken, String refreshToken) {
public SignInResponseDto(String memberUuid, String accessToken, String refreshToken) {
this.memberUuid = memberUuid;
this.accessToken = accessToken;
this.refreshToken = refreshToken;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public interface AuthRepositoryPort {
// Boolean existsByNickname(String nickname);
Boolean existsByPhoneNumber(String phoneNumber);
Optional<AuthResponseDto> findByMemberId(String memberId);
GetMemberIdResponseDto findMemberIdByPhoneNumber (GetMemberIdDto getMemberIdDto);
Optional<GetMemberIdResponseDto> findMemberIdByPhoneNumber (GetMemberIdDto getMemberIdDto);
void resetPassword(String phoneNumber, String encryptedPassword);

}
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,9 @@ public GetMemberIdResponseDto getMemberId(GetMemberIdRequestDto getMemberIdReque
throw new BaseException(BaseResponseStatus.FIND_MEMBER_ID_NOT_VERIFIED);
}

return authRepositoryPort.findMemberIdByPhoneNumber(authMapper.toGetMemberIdDto(getMemberIdRequestDto));
return authRepositoryPort.findMemberIdByPhoneNumber(
authMapper.toGetMemberIdDto(getMemberIdRequestDto)
).orElseThrow(() -> new BaseException(BaseResponseStatus.USER_NOT_FOUND));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,43 @@
package com.chalnakchalnak.authservice.common.config;

import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import org.springdoc.core.models.GroupedOpenApi;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;


@OpenAPIDefinition(
info = @io.swagger.v3.oas.annotations.info.Info(
title = "Auth-Service API",
version = "v1",
description = "Auth μ„œλΉ„μŠ€"
), security = {
@io.swagger.v3.oas.annotations.security.SecurityRequirement(name = "Authorization")
}
)

// @Profile("!prod")
@Configuration
public class SwaggerConfig {

private static final String BEARER_TOKEN_PREFIX = "Bearer";

@Bean
public GroupedOpenApi publicApi() {
String[] paths = {"/api/v1/**"};
return GroupedOpenApi.builder()
.group("public-api")
.pathsToMatch(paths)
.build();
public OpenAPI openAPI() {

String securityJwtName = "JWT";
SecurityRequirement securityRequirement = new SecurityRequirement().addList(securityJwtName);
Components components = new Components()
.addSecuritySchemes(securityJwtName, new SecurityScheme()
.name(securityJwtName)
.type(SecurityScheme.Type.HTTP)
.scheme(BEARER_TOKEN_PREFIX)
.bearerFormat(securityJwtName));

return new OpenAPI()
.addSecurityItem(securityRequirement)
.components(components)
.addServersItem(new Server().url("/auth-service"))
.info(apiInfo());
}

private Info apiInfo() {
return new Info()
.title("MSA - AUTH SERVICE λ¬Έμ„œ")
.description("00 API ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ Swagger UI")
.version("1.0.0");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ public enum BaseResponseStatus {
FIND_MEMBER_ID_NOT_VERIFIED(HttpStatus.UNAUTHORIZED, 4207, "아이디 μ°ΎκΈ°λ₯Ό μœ„ν•œ 본인 인증을 λ¨Όμ € μ§„ν–‰ν•΄μ£Όμ„Έμš”."),
RESET_PASSWORD_NOT_VERIFIED(HttpStatus.UNAUTHORIZED, 4208, "λΉ„λ°€λ²ˆν˜Έ μž¬μ„€μ •μ„ μœ„ν•œ 본인 인증을 λ¨Όμ € μ§„ν–‰ν•΄μ£Όμ„Έμš”."),

/**
* 4300~4399: feign client error(member-service)
*/
MEMBER_SERVICE_CREATE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 4300, "member-service νšŒμ› 생성 μš”μ²­μ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€."),
MEMBER_SERVICE_EXISTS_NICKNAME_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 4301, "member-service λ‹‰λ„€μž„ 쀑볡 확인 μš”μ²­μ— μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€."),

/**
* 4900~4999 : 기타 μ—λŸ¬
Expand Down
18 changes: 12 additions & 6 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ spring:

datasource:
url: ${MYSQL_URL}
username: ${MYSQL_USERNAME:root}
password: ${MYSQL_PASSWORD:cabbage123456!}
username: ${MYSQL_USERNAME}
password: ${MYSQL_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver

jpa:
Expand All @@ -32,10 +32,15 @@ coolsms:
domain: https://api.coolsms.co.kr

JWT:
secret-key: ${JWT_SECRET}
secret-key: ${JWT_SECRET}
token:
access-expire-time: 604800
refresh-expire-time: 1209600
access-expire-time: ${ACCESS_TOKEN_EXPIRE_TIME}
refresh-expire-time: ${REFRESH_TOKEN_EXPIRE_TIME}

feign:
client:
member-service:
url: ${MEMBER_SERVICE_URL}

management:
endpoints:
Expand All @@ -52,4 +57,5 @@ springdoc:
swagger-ui:
enabled: true
path: /swagger-ui
config-url: /v3/api-docs/swagger-config
config-url: /auth-service/v3/api-docs/swagger-config
url: /auth-service/v3/api-docs
Loading