add gigawear auth repository

This commit is contained in:
2026-09-14 18:30:53 +03:00
parent e77046018d
commit f41d7aec33
23 changed files with 254 additions and 41 deletions
@@ -6,6 +6,7 @@ import ru.shadowsparky.backend.data.EnvFetcher
import ru.shadowsparky.backend.data.JwtPreparer
import ru.shadowsparky.backend.data.StringFetcher
import ru.shadowsparky.backend.data.StringResource
import ru.shadowsparky.backend.data.toTokenHash
import ru.shadowsparky.backend.domain.LoginVerifier
import ru.shadowsparky.domain.Log
import ru.shadowsparky.http.domain.BadRequestException
@@ -17,10 +18,8 @@ import ru.shadowsparky.vbox.shared.domain.AuthTokenRepository
import ru.shadowsparky.vbox.shared.domain.ChangePasswordRequest
import ru.shadowsparky.vbox.shared.domain.TokenRequest
import ru.shadowsparky.vbox.shared.domain.model.LoginInfo
import java.security.MessageDigest
import java.security.SecureRandom
import java.util.concurrent.TimeUnit
import kotlin.io.encoding.Base64
@Factory
class AuthTokenRepositoryFactory(
@@ -131,10 +130,10 @@ class BackendAuthTokenRepository(
}
private suspend fun create(login: String): TokenInfo = withContext(dispatcherProvider.io) {
loginVerifier.verify(login)
val userInfo = userInfoCache.query(login)
?: throw BadRequestException(stringFetcher.get(StringResource.UNKNOWN_USER))
val rsp = jwtPreparer.prepare(login, userInfo.userId)
loginVerifier.verify(userInfo.userId)
val rsp = jwtPreparer.prepare(userInfo.userId)
val refresh = ByteArray(32)
random.nextBytes(refresh)
val refreshStr = refresh.toHexString()
@@ -164,10 +163,7 @@ class BackendAuthTokenRepository(
}
private fun String.toHash(): String {
val md = MessageDigest.getInstance("SHA-256")
md.update(SALT.toByteArray())
val result = md.digest(this.toByteArray())
return Base64.encode(result)
return toTokenHash(SALT)
}
private companion object {
@@ -12,8 +12,8 @@ class BackendLoginVerifier(
private val stringFetcher: StringFetcher,
private val userInfoCache: UserInfoCache
) : LoginVerifier {
override suspend fun verify(login: String) {
val user = userInfoCache.query(login)
override suspend fun verify(userId: Long) {
val user = userInfoCache.query(userId)
?: throw VerifyTokenException(stringFetcher.get(StringResource.UNKNOWN_USER))
user.flags?.let {
if ((it and FLAG_USER_BLOCKED) != 0) {
@@ -30,4 +30,4 @@ class DbModule {
fun provideDb(driver: SqlDriver): AppDatabase {
return AppDatabase.Companion.invoke(driver)
}
}
}
@@ -8,7 +8,7 @@ import ru.shadowsparky.backend.domain.JwtInfo
import ru.shadowsparky.backend.domain.LoginVerifier
import ru.shadowsparky.backend.domain.RemoteEventHandler
import ru.shadowsparky.chat.backend.domain.ProcessUserMessageUseCase
import ru.shadowsparky.vbox.backend.data.BackendUpdateFetcherFactory
import ru.shadowsparky.updater.backend.data.BackendUpdateFetcherFactory
import ru.shadowsparky.vbox.backend.data.auth.AuthTokenRepositoryFactory
import ru.shadowsparky.vbox.backend.data.chat.BackendChatRepositoryFactory
import ru.shadowsparky.vbox.backend.data.tags.MovieTagRepositoryFactory
@@ -6,8 +6,6 @@ import ru.shadowsparky.backend.presentation.configureJwt
import ru.shadowsparky.backend.presentation.obtainUserId
import ru.shadowsparky.vbox.backend.di.AuthEntryPoint
const val AUTH_JWT_NAME = "auth-jwt"
fun Application.configureJwt(authEntryPoint: AuthEntryPoint) = with(authEntryPoint) {
configureJwt(jwtInfo, tokenVerifier, loginVerifier)
}
@@ -7,9 +7,9 @@ import io.ktor.server.response.respond
import io.ktor.server.routing.Routing
import io.ktor.server.routing.get
import io.ktor.server.routing.post
import ru.shadowsparky.backend.presentation.AUTH_JWT_NAME
import ru.shadowsparky.vbox.backend.di.AuthEntryPoint
import ru.shadowsparky.vbox.backend.di.RoutingEntryPoint
import ru.shadowsparky.vbox.backend.presentation.AUTH_JWT_NAME
import ru.shadowsparky.vbox.backend.presentation.obtainUserId
import ru.shadowsparky.vbox.shared.domain.AuthTokenRepository
import ru.shadowsparky.vbox.shared.domain.HealthCheck