Skip to content

Commit fe2e174

Browse files
committed
feat : 클라이언트 ip를 Oauth코드발급 요청 시점에서 받게 수정
1 parent 6449eee commit fe2e174

File tree

8 files changed

+31
-11
lines changed

8 files changed

+31
-11
lines changed

build.gradle.kts

+5
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,8 @@ allOpen {
7474
tasks.withType<Test> {
7575
useJUnitPlatform()
7676
}
77+
78+
79+
tasks.bootJar {
80+
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
81+
}

src/main/kotlin/nanucloud/nanuid/domain/oauth/domain/OAuthClientAuthCode.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ data class OAuthClientAuthCode(
1212
val userId: String,
1313
val applicationId: String,
1414
val authScope: Int,
15-
val deviceType: DeviceType
15+
val deviceType: DeviceType,
16+
val userIp : String
1617
)

src/main/kotlin/nanucloud/nanuid/domain/oauth/entity/OAuthClientAuthCodeRedisEntity.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ class OAuthClientAuthCodeRedisEntity(
1717

1818
val applicationId : String,
1919
val authScope: Int,
20-
val deviceType: DeviceType
20+
val deviceType: DeviceType,
21+
val userIp: String,
2122
)

src/main/kotlin/nanucloud/nanuid/domain/oauth/mapper/OAuthClientAuthCodeMapper.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class OAuthClientAuthCodeMapper {
1313
userId = userId,
1414
applicationId = applicationId,
1515
authScope = authScope,
16-
deviceType = deviceType
16+
deviceType = deviceType,
17+
userIp = userIp
1718
)
1819
}
1920
}
@@ -25,7 +26,8 @@ class OAuthClientAuthCodeMapper {
2526
userId = userId,
2627
applicationId = applicationId,
2728
authScope = authScope,
28-
deviceType = deviceType
29+
deviceType = deviceType,
30+
userIp = userIp
2931
)
3032
}
3133
}

src/main/kotlin/nanucloud/nanuid/domain/oauth/service/OAuthCodeIssueService.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ class OAuthCodeIssueService(
4949
authCodeDomain.applicationId,
5050
application.name,
5151
authCodeDomain.deviceType,
52-
authScopes
52+
authScopes,
53+
authCodeDomain.userIp
5354
)
5455
}
5556
}

src/main/kotlin/nanucloud/nanuid/domain/user/service/UserOAuthPrimaryLoginService.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package nanucloud.nanuid.domain.user.service
22

3+
import jakarta.servlet.http.HttpServletRequest
34
import jakarta.transaction.Transactional
45
import nanucloud.nanuid.domain.application.persistence.repository.ApplicationJpaRepository
56
import nanucloud.nanuid.domain.auth.domain.AuthScope
@@ -13,6 +14,7 @@ import nanucloud.nanuid.domain.user.exception.*
1314
import nanucloud.nanuid.domain.user.persistence.repository.UserJpaRepository
1415
import nanucloud.nanuid.domain.user.presentation.dto.request.UserOAuthLoginRequest
1516
import nanucloud.nanuid.domain.user.presentation.dto.response.UserOAuthLoginResponse
17+
import nanucloud.nanuid.global.base.IpUtils
1618
import nanucloud.nanuid.global.security.jwt.JwtProvider
1719
import org.springframework.beans.factory.annotation.Value
1820
import org.springframework.security.crypto.password.PasswordEncoder
@@ -28,6 +30,8 @@ class UserOAuthPrimaryLoginService(
2830
private val applicationJpaRepository: ApplicationJpaRepository,
2931
private val permissionJpaRepository: PermissionJpaRepository,
3032
private val oAuthClientAuthCodeRedisRepository: OAuthClientAuthCodeRedisRepository,
33+
private val ipUtils: IpUtils,
34+
private val request: HttpServletRequest,
3135
@Value("\${recaptcha.secret-key}") private val recaptchaSecretKey: String
3236
) {
3337
@Transactional
@@ -64,7 +68,8 @@ class UserOAuthPrimaryLoginService(
6468
userId = user.id.toString(),
6569
applicationId = userOAuthLoginRequest.applicationId,
6670
authScope = userOAuthLoginRequest.authScope,
67-
deviceType = userOAuthLoginRequest.deviceType ?: DeviceType.WEB_UNKNOWN
71+
deviceType = userOAuthLoginRequest.deviceType ?: DeviceType.WEB_UNKNOWN,
72+
userIp = ipUtils.getClientIp(request)
6873
)
6974

7075
oAuthClientAuthCodeRedisRepository.save(

src/main/kotlin/nanucloud/nanuid/domain/user/service/UserReissueService.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class UserReissueService(
1818
if (!jwtProvider.validateRefreshToken(refreshToken)) {
1919
throw ExpiredTokenException
2020
}
21-
val accountId = jwtProvider.getuserIdFromToken(refreshToken)
21+
val accountId = jwtProvider.getUserIdFromToken(refreshToken)
2222
val authScopes = jwtProvider.getAuthScopeFromToken(refreshToken)
2323
val accessToken = jwtProvider.generateJwtToken(accountId, JwtProvider.ACCESS_KEY, jwtProperties.accessExp, authScopes)
2424

src/main/kotlin/nanucloud/nanuid/global/security/jwt/JwtProvider.kt

+9-4
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,16 @@ class JwtProvider(
4343
}
4444

4545
@Transactional
46-
fun generateToken(userId: String, applicationId: String,applicationName: String, deviceType: DeviceType, authScope: Set<AuthScope>): TokenResponse {
46+
fun generateToken(userId: String, applicationId: String, applicationName: String, deviceType: DeviceType, authScope: Set<AuthScope>, userIp: String? = null): TokenResponse {
4747
val accessToken = generateJwtToken(userId, ACCESS_KEY, jwtProperties.accessExp, authScope)
4848
val refreshToken = generateJwtToken(userId, REFRESH_KEY, jwtProperties.refreshExp, authScope)
4949
val authTime = LocalDateTime.now()
50-
val userIp = ipUtils.getClientIp(request)
50+
51+
val userConnectIp = if (!userIp.isNullOrEmpty()) {
52+
userIp
53+
} else {
54+
ipUtils.getClientIp(request)
55+
}
5156

5257
val refreshTokenEntity = RefreshToken(
5358
refreshToken = refreshToken,
@@ -56,7 +61,7 @@ class JwtProvider(
5661
applicationName = applicationName,
5762
deviceType = deviceType,
5863
authTime = authTime,
59-
ip = userIp,
64+
ip = userConnectIp
6065
)
6166
refreshTokenJpaRepository.save(refreshTokenMapper.toEntity(refreshTokenEntity))
6267

@@ -154,7 +159,7 @@ class JwtProvider(
154159
return AuthScope.values().filter { scope -> (bitmask and scope.bit) != 0 }.toSet()
155160
}
156161

157-
fun getuserIdFromToken(token: String): String {
162+
fun getUserIdFromToken(token: String): String {
158163
val body = getJws(token).body
159164
return body.subject
160165
}

0 commit comments

Comments
 (0)