From dcc35b3b102291a637a338fa99f348db010794b4 Mon Sep 17 00:00:00 2001 From: Mikhail Yasnov Date: Fri, 2 Jul 2021 14:43:42 +0300 Subject: [PATCH 1/2] Add method to mark token refreshed --- .../auth/core/tokens/refresh/dto/RefreshToken.kt | 1 + .../tokens/refresh/models/RefreshTokenEntity.kt | 4 +++- .../refresh/services/RefreshTokenCoreService.kt | 1 + .../services/RefreshTokenCoreServiceImpl.kt | 13 +++++++++++++ .../202107021246__alter_table__refresh_tokens.yml | 15 +++++++++++++++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 auth-jwt-core/src/main/resources/auth/db/changelog/core/202107021246__alter_table__refresh_tokens.yml diff --git a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/dto/RefreshToken.kt b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/dto/RefreshToken.kt index c4988b6..c8a67cd 100644 --- a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/dto/RefreshToken.kt +++ b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/dto/RefreshToken.kt @@ -6,5 +6,6 @@ import java.time.ZonedDateTime data class RefreshToken( val value: String, val expiresAt: ZonedDateTime, + val refreshedAt: ZonedDateTime?, val user: User, ) diff --git a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/models/RefreshTokenEntity.kt b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/models/RefreshTokenEntity.kt index 93e3c8c..879b43a 100644 --- a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/models/RefreshTokenEntity.kt +++ b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/models/RefreshTokenEntity.kt @@ -25,6 +25,8 @@ class RefreshTokenEntity : AuditableUuidIdEntity() { lateinit var expiresAt: ZonedDateTime + var refreshedAt: ZonedDateTime? = null + @ManyToOne @JoinColumn(name = "user_id") lateinit var user: UserEntity @@ -43,7 +45,7 @@ class RefreshTokenEntity : AuditableUuidIdEntity() { lateinit var scopes: Set fun validate(): RefreshTokenEntity = this.apply { - if (expiresAt.isExpired()) { + if (expiresAt.isExpired() || refreshedAt != null) { throw RefreshTokenExpiredException(value) } } diff --git a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreService.kt b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreService.kt index b87552f..cafe4ad 100644 --- a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreService.kt +++ b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreService.kt @@ -7,5 +7,6 @@ interface RefreshTokenCoreService { fun get(value: String): RefreshToken fun create(token: NewRefreshToken): RefreshToken + fun setRefreshed(value: String): RefreshToken } diff --git a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreServiceImpl.kt b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreServiceImpl.kt index dbad070..30663d6 100644 --- a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreServiceImpl.kt +++ b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreServiceImpl.kt @@ -52,6 +52,18 @@ class RefreshTokenCoreServiceImpl( .toDto() } + @Transactional + override fun setRefreshed(value: String): RefreshToken { + val refreshToken = refreshTokenRepository.findByValueOrThrow(value) + .validate() + .apply { + refreshedAt = ZonedDateTime.now() + } + + return refreshTokenRepository.save(refreshToken) + .toDto() + } + private fun getExpirationDate(): ZonedDateTime { return ZonedDateTime.now().plus(refreshTokenProperties.timeToLive) } @@ -69,6 +81,7 @@ class RefreshTokenCoreServiceImpl( return RefreshToken( value = value, expiresAt = expiresAt, + refreshedAt = refreshedAt, user = user.toDto(device) ) } diff --git a/auth-jwt-core/src/main/resources/auth/db/changelog/core/202107021246__alter_table__refresh_tokens.yml b/auth-jwt-core/src/main/resources/auth/db/changelog/core/202107021246__alter_table__refresh_tokens.yml new file mode 100644 index 0000000..39fa49b --- /dev/null +++ b/auth-jwt-core/src/main/resources/auth/db/changelog/core/202107021246__alter_table__refresh_tokens.yml @@ -0,0 +1,15 @@ +databaseChangeLog: + - changeSet: + id: 202107021246__alter_table__refresh_tokens + author: touchin + preConditions: + - onFail: MARK_RAN + tableExists: + tableName: refresh_tokens + changes: + - addColumn: + tableName: refresh_tokens + columns: + - column: + name: refreshed_at + type: TIMESTAMP WITH TIME ZONE From 1dde5efd61954def49c481d8649fbefa9ee246e0 Mon Sep 17 00:00:00 2001 From: Mikhail Yasnov Date: Fri, 2 Jul 2021 14:57:29 +0300 Subject: [PATCH 2/2] Rename RefreshToken usedAt field --- .../ru/touchin/auth/core/tokens/refresh/dto/RefreshToken.kt | 2 +- .../auth/core/tokens/refresh/models/RefreshTokenEntity.kt | 4 ++-- .../core/tokens/refresh/services/RefreshTokenCoreService.kt | 2 +- .../tokens/refresh/services/RefreshTokenCoreServiceImpl.kt | 6 +++--- .../core/202107021246__alter_table__refresh_tokens.yml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/dto/RefreshToken.kt b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/dto/RefreshToken.kt index c8a67cd..b9ae985 100644 --- a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/dto/RefreshToken.kt +++ b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/dto/RefreshToken.kt @@ -6,6 +6,6 @@ import java.time.ZonedDateTime data class RefreshToken( val value: String, val expiresAt: ZonedDateTime, - val refreshedAt: ZonedDateTime?, + val usedAt: ZonedDateTime?, val user: User, ) diff --git a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/models/RefreshTokenEntity.kt b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/models/RefreshTokenEntity.kt index 879b43a..5a76bef 100644 --- a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/models/RefreshTokenEntity.kt +++ b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/models/RefreshTokenEntity.kt @@ -25,7 +25,7 @@ class RefreshTokenEntity : AuditableUuidIdEntity() { lateinit var expiresAt: ZonedDateTime - var refreshedAt: ZonedDateTime? = null + var usedAt: ZonedDateTime? = null @ManyToOne @JoinColumn(name = "user_id") @@ -45,7 +45,7 @@ class RefreshTokenEntity : AuditableUuidIdEntity() { lateinit var scopes: Set fun validate(): RefreshTokenEntity = this.apply { - if (expiresAt.isExpired() || refreshedAt != null) { + if (expiresAt.isExpired() || usedAt != null) { throw RefreshTokenExpiredException(value) } } diff --git a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreService.kt b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreService.kt index cafe4ad..a1b15bc 100644 --- a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreService.kt +++ b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreService.kt @@ -7,6 +7,6 @@ interface RefreshTokenCoreService { fun get(value: String): RefreshToken fun create(token: NewRefreshToken): RefreshToken - fun setRefreshed(value: String): RefreshToken + fun setUsed(value: String): RefreshToken } diff --git a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreServiceImpl.kt b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreServiceImpl.kt index 30663d6..b5f572a 100644 --- a/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreServiceImpl.kt +++ b/auth-jwt-core/src/main/kotlin/ru/touchin/auth/core/tokens/refresh/services/RefreshTokenCoreServiceImpl.kt @@ -53,11 +53,11 @@ class RefreshTokenCoreServiceImpl( } @Transactional - override fun setRefreshed(value: String): RefreshToken { + override fun setUsed(value: String): RefreshToken { val refreshToken = refreshTokenRepository.findByValueOrThrow(value) .validate() .apply { - refreshedAt = ZonedDateTime.now() + usedAt = ZonedDateTime.now() } return refreshTokenRepository.save(refreshToken) @@ -81,7 +81,7 @@ class RefreshTokenCoreServiceImpl( return RefreshToken( value = value, expiresAt = expiresAt, - refreshedAt = refreshedAt, + usedAt = usedAt, user = user.toDto(device) ) } diff --git a/auth-jwt-core/src/main/resources/auth/db/changelog/core/202107021246__alter_table__refresh_tokens.yml b/auth-jwt-core/src/main/resources/auth/db/changelog/core/202107021246__alter_table__refresh_tokens.yml index 39fa49b..e22ba2b 100644 --- a/auth-jwt-core/src/main/resources/auth/db/changelog/core/202107021246__alter_table__refresh_tokens.yml +++ b/auth-jwt-core/src/main/resources/auth/db/changelog/core/202107021246__alter_table__refresh_tokens.yml @@ -11,5 +11,5 @@ databaseChangeLog: tableName: refresh_tokens columns: - column: - name: refreshed_at + name: used_at type: TIMESTAMP WITH TIME ZONE