Skip to content

Commit

Permalink
Merge pull request #9 from ASAP-Lettering/ASAP-69
Browse files Browse the repository at this point in the history
ASAP-69 feat: JWT(Register, Acess, Refresh) 생성 구현체 추가 및 테스트 코드 반영
  • Loading branch information
tlarbals824 authored Aug 30, 2024
2 parents 4544a55 + 2dd46e7 commit 474d15a
Show file tree
Hide file tree
Showing 30 changed files with 435 additions and 98 deletions.
4 changes: 4 additions & 0 deletions .deploy/task/task-definition.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
{
"valueFrom": "arn:aws:secretsmanager:ap-northeast-2:396608783702:secret:dev/mysql-vHY6zz:DB_PASSWORD::",
"name": "DB_PASSWORD"
},
{
"valueFrom": "arn:aws:ssm:ap-northeast-2:396608783702:parameter/jwt/secret",
"name": "JWT_SECRET"
}
]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.asap.application.user.port.out
import com.asap.application.user.vo.UserClaims
import com.asap.domain.user.entity.User

interface UserTokenManagementPort {
interface UserTokenConvertPort {
fun resolveRegisterToken(token: String): UserClaims.Register

fun generateRegisterToken(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ import com.asap.application.user.exception.UserException
import com.asap.application.user.port.`in`.RegisterUserUsecase
import com.asap.application.user.port.out.UserAuthManagementPort
import com.asap.application.user.port.out.UserManagementPort
import com.asap.application.user.port.out.UserTokenManagementPort
import com.asap.application.user.port.out.UserTokenConvertPort
import com.asap.domain.user.entity.User
import com.asap.domain.user.entity.UserAuth
import com.asap.domain.user.vo.UserPermission
import org.springframework.stereotype.Service

@Service
class RegisterUserService(
private val userTokenManagementPort: UserTokenManagementPort,
private val userTokenConvertPort: UserTokenConvertPort,
private val userAuthManagementPort: UserAuthManagementPort,
private val userManagementPort: UserManagementPort
) : RegisterUserUsecase {
Expand All @@ -23,9 +23,8 @@ class RegisterUserService(
* 3. 추출한 사용자 정보와 함께 사용자 동의 검증 -> 동의하지 않으면 에러
* 4. 사용자 정보 저장 및 jwt 토큰 반환
*/

override fun registerUser(command: RegisterUserUsecase.Command): RegisterUserUsecase.Response {
val userClaims = userTokenManagementPort.resolveRegisterToken(command.registerToken)
val userClaims = userTokenConvertPort.resolveRegisterToken(command.registerToken)
if (userAuthManagementPort.isExistsUserAuth(userClaims.socialId, userClaims.socialLoginProvider)) {
throw UserException.UserAlreadyRegisteredException()
}
Expand All @@ -47,8 +46,8 @@ class RegisterUserService(
userAuthManagementPort.saveUserAuth(userAuth)

return RegisterUserUsecase.Response(
userTokenManagementPort.generateAccessToken(registerUser),
userTokenManagementPort.generateRefreshToken(registerUser)
userTokenConvertPort.generateAccessToken(registerUser),
userTokenConvertPort.generateRefreshToken(registerUser)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.asap.application.user.port.`in`.SocialLoginUsecase
import com.asap.application.user.port.out.AuthInfoRetrievePort
import com.asap.application.user.port.out.UserAuthManagementPort
import com.asap.application.user.port.out.UserManagementPort
import com.asap.application.user.port.out.UserTokenManagementPort
import com.asap.application.user.port.out.UserTokenConvertPort
import com.asap.common.exception.DefaultException
import com.asap.domain.user.enums.SocialLoginProvider
import org.springframework.stereotype.Service
Expand All @@ -14,7 +14,7 @@ import org.springframework.stereotype.Service
class SocialLoginService(
private val userAuthManagementPort: UserAuthManagementPort,
private val authInfoRetrievePort: AuthInfoRetrievePort,
private val userTokenManagementPort: UserTokenManagementPort,
private val userTokenConvertPort: UserTokenConvertPort,
private val userManagementPort: UserManagementPort
) : SocialLoginUsecase {

Expand All @@ -25,18 +25,19 @@ class SocialLoginService(
return userAuth?.let {
userManagementPort.getUser(userAuth.userId)?.let {
SocialLoginUsecase.Success(
userTokenManagementPort.generateAccessToken(it),
userTokenManagementPort.generateRefreshToken(it)
userTokenConvertPort.generateAccessToken(it),
userTokenConvertPort.generateRefreshToken(it)
)
} ?: run {
throw DefaultException.InvalidStateException("사용자 인증정보만 존재합니다. - ${userAuth.userId}")
}
} ?: run {
val registerToken = userTokenManagementPort.generateRegisterToken(
val registerToken = userTokenConvertPort.generateRegisterToken(
authInfo.socialId,
authInfo.socialLoginProvider.name,
authInfo.username
)

SocialLoginUsecase.NonRegistered(registerToken)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.asap.application.user.exception.UserException
import com.asap.application.user.port.`in`.RegisterUserUsecase
import com.asap.application.user.port.out.UserAuthManagementPort
import com.asap.application.user.port.out.UserManagementPort
import com.asap.application.user.port.out.UserTokenManagementPort
import com.asap.application.user.port.out.UserTokenConvertPort
import com.asap.application.user.vo.UserClaims
import com.asap.common.exception.DefaultException
import com.asap.domain.user.enums.SocialLoginProvider
Expand All @@ -21,22 +21,22 @@ class RegisterUserServiceTest: BehaviorSpec({

val mockUserManagementPort = mockk<UserManagementPort>(relaxed = true)
val mockUserAuthManagementPort = mockk<UserAuthManagementPort>(relaxed=true)
val mockUserTokenManagementPort = mockk<UserTokenManagementPort>()
val mockUserTokenConvertPort = mockk<UserTokenConvertPort>()


val registerUserService = RegisterUserService(mockUserTokenManagementPort, mockUserAuthManagementPort, mockUserManagementPort)
val registerUserService = RegisterUserService(mockUserTokenConvertPort, mockUserAuthManagementPort, mockUserManagementPort)


given("회원 가입 요청이 들어왔을 때") {
val successCommand = RegisterUserUsecase.Command("valid", true, true, true, LocalDate.now())
every { mockUserTokenManagementPort.resolveRegisterToken("valid") } returns UserClaims.Register(
every { mockUserTokenConvertPort.resolveRegisterToken("valid") } returns UserClaims.Register(
socialId = "123",
socialLoginProvider = SocialLoginProvider.KAKAO,
username = "test"
)
every { mockUserAuthManagementPort.isExistsUserAuth("123", SocialLoginProvider.KAKAO) } returns false
every { mockUserTokenManagementPort.generateAccessToken(any()) } returns "accessToken"
every { mockUserTokenManagementPort.generateRefreshToken(any()) } returns "refreshToken"
every { mockUserTokenConvertPort.generateAccessToken(any()) } returns "accessToken"
every { mockUserTokenConvertPort.generateRefreshToken(any()) } returns "refreshToken"
`when`("회원 가입이 성공하면") {
val response = registerUserService.registerUser(successCommand)
then("access token과 refresh token을 반환한다.") {
Expand All @@ -47,7 +47,7 @@ class RegisterUserServiceTest: BehaviorSpec({
}


every { mockUserTokenManagementPort.resolveRegisterToken("duplicate") } returns UserClaims.Register(
every { mockUserTokenConvertPort.resolveRegisterToken("duplicate") } returns UserClaims.Register(
socialId = "duplicate",
socialLoginProvider = SocialLoginProvider.KAKAO,
username = "test"
Expand All @@ -62,7 +62,7 @@ class RegisterUserServiceTest: BehaviorSpec({
}
}

every { mockUserTokenManagementPort.resolveRegisterToken("invalid") } throws IllegalArgumentException("Invalid token")
every { mockUserTokenConvertPort.resolveRegisterToken("invalid") } throws IllegalArgumentException("Invalid token")
`when`("register token이 유요하지 않다면") {
val failCommandWithoutRegisterToken =
RegisterUserUsecase.Command("invalid", true, true, true, LocalDate.now())
Expand All @@ -74,7 +74,7 @@ class RegisterUserServiceTest: BehaviorSpec({
}


every { mockUserTokenManagementPort.resolveRegisterToken("valid") } returns UserClaims.Register(
every { mockUserTokenConvertPort.resolveRegisterToken("valid") } returns UserClaims.Register(
socialId = "123",
socialLoginProvider = SocialLoginProvider.KAKAO,
username = "test"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.asap.application.user.port.`in`.SocialLoginUsecase
import com.asap.application.user.port.out.AuthInfoRetrievePort
import com.asap.application.user.port.out.UserAuthManagementPort
import com.asap.application.user.port.out.UserManagementPort
import com.asap.application.user.port.out.UserTokenManagementPort
import com.asap.application.user.port.out.UserTokenConvertPort
import com.asap.application.user.vo.AuthInfo
import com.asap.common.exception.DefaultException
import com.asap.domain.common.DomainId
Expand All @@ -24,12 +24,12 @@ class SocialLoginServiceTest : BehaviorSpec({
val mockUserAuthManagementPort = mockk<UserAuthManagementPort>()
val mockAuthInfoRetrievePort = mockk<AuthInfoRetrievePort>()
val mockUserManagementPort = mockk<UserManagementPort>()
val mockUserTokenManagementPort = mockk<UserTokenManagementPort>()
val mockUserTokenConvertPort = mockk<UserTokenConvertPort>()

val socialLoginService = SocialLoginService(
mockUserAuthManagementPort,
mockAuthInfoRetrievePort,
mockUserTokenManagementPort,
mockUserTokenConvertPort,
mockUserManagementPort
)

Expand All @@ -54,8 +54,8 @@ class SocialLoginServiceTest : BehaviorSpec({
)
} returns getUserAuth
every{ mockUserManagementPort.getUser(any()) } returns getUser
every { mockUserTokenManagementPort.generateAccessToken(getUser) } returns "accessToken"
every { mockUserTokenManagementPort.generateRefreshToken(getUser) } returns "refreshToken"
every { mockUserTokenConvertPort.generateAccessToken(getUser) } returns "accessToken"
every { mockUserTokenConvertPort.generateRefreshToken(getUser) } returns "refreshToken"
`when`("기존에 존재한다면") {
val response = socialLoginService.login(command)
then("access token과 refresh token을 반환하는 success 인스턴스를 반환한다.") {
Expand All @@ -78,7 +78,7 @@ class SocialLoginServiceTest : BehaviorSpec({
command = SocialLoginUsecase.Command(SocialLoginProvider.KAKAO.name, "nonRegistered")
every { mockAuthInfoRetrievePort.getAuthInfo(SocialLoginProvider.KAKAO, "nonRegistered") } returns authInfo
every { mockUserAuthManagementPort.getUserAuth(authInfo.socialId, authInfo.socialLoginProvider) } returns null
every { mockUserTokenManagementPort.generateRegisterToken(authInfo.socialId, authInfo.socialLoginProvider.name, authInfo.username) } returns "registerToken"
every { mockUserTokenConvertPort.generateRegisterToken(authInfo.socialId, authInfo.socialLoginProvider.name, authInfo.username) } returns "registerToken"
`when`("가입되지 않았다면") {
val response = socialLoginService.login(command)
then("register token을 반환하는 nonRegistered 인스턴스를 반환한다.") {
Expand Down
2 changes: 2 additions & 0 deletions Bootstrap-Module/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ dependencies{

implementation(project(":Infrastructure-Module:Client"))
testImplementation(testFixtures(project(":Infrastructure-Module:Client")))
implementation(project(":Infrastructure-Module:Security"))
testImplementation(testFixtures(project(":Infrastructure-Module:Security")))
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.asap.bootstrap

import com.asap.application.ApplicationConfig
import com.asap.client.ClientConfig
import com.asap.security.SecurityConfig
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.context.annotation.Import
Expand All @@ -10,7 +11,8 @@ import org.springframework.context.annotation.Import
@Import(
value = [
ApplicationConfig::class,
ClientConfig::class
ClientConfig::class,
SecurityConfig::class
]
)
class BootstrapApplication {}
Expand Down
19 changes: 7 additions & 12 deletions Bootstrap-Module/src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
spring:
config:
activate:
on-profile: dev


---


spring:
config:
activate:
on-profile: default
profiles:
group:
dev:
- security
local:
- security-local
active: local
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ class AuthApiIntegrationTest {
isString()
isNotEmpty()
}
}.andDo {
print()
}
}

Expand Down
Loading

0 comments on commit 474d15a

Please sign in to comment.