diff --git a/auth-gateway/auth-gateway-app/src/main/kotlin/co/nilin/opex/auth/proxy/KeycloakProxy.kt b/auth-gateway/auth-gateway-app/src/main/kotlin/co/nilin/opex/auth/proxy/KeycloakProxy.kt index 7a960fe66..4b7db3347 100644 --- a/auth-gateway/auth-gateway-app/src/main/kotlin/co/nilin/opex/auth/proxy/KeycloakProxy.kt +++ b/auth-gateway/auth-gateway-app/src/main/kotlin/co/nilin/opex/auth/proxy/KeycloakProxy.kt @@ -3,6 +3,7 @@ package co.nilin.opex.auth.proxy import co.nilin.opex.auth.config.KeycloakConfig import co.nilin.opex.auth.data.ActiveSession import co.nilin.opex.auth.model.* +import co.nilin.opex.auth.utils.generateRandomID import co.nilin.opex.common.OpexError import co.nilin.opex.common.utils.LoggerDelegate import kotlinx.coroutines.reactive.awaitFirstOrElse @@ -15,7 +16,10 @@ import org.springframework.http.HttpHeaders import org.springframework.http.HttpStatus import org.springframework.http.MediaType import org.springframework.stereotype.Service -import org.springframework.web.reactive.function.client.* +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.reactive.function.client.awaitBodilessEntity +import org.springframework.web.reactive.function.client.awaitBody +import org.springframework.web.reactive.function.client.bodyToMono @Service class KeycloakProxy( @@ -152,14 +156,14 @@ class KeycloakProxy( ) { val keycloakUrl = "${keycloakConfig.url}/admin/realms/${keycloakConfig.realm}/users" val token = getAdminAccessToken() - + val internalID = generateRandomInternalID() val response = keycloakClient.post() .uri(keycloakUrl) .header("Content-Type", "application/json") .withAdminToken(token) .bodyValue( hashMapOf( - "username" to username.value, + "username" to internalID, "emailVerified" to enabled, "firstName" to firstName, "lastName" to lastName, @@ -358,4 +362,16 @@ class KeycloakProxy( return this } + private suspend fun generateRandomInternalID(): String { + var internalId: String; + var attempts = 0 + do { + if (attempts >= 10) { + throw OpexError.InternalIdGenerateFailed.exception() + } + internalId = generateRandomID() + attempts++ + } while (findUserByAttribute(Attribute("username", internalId)).isNotEmpty()) + return internalId + } } \ No newline at end of file diff --git a/auth-gateway/auth-gateway-app/src/main/kotlin/co/nilin/opex/auth/utils/InternalIdGenerator.kt b/auth-gateway/auth-gateway-app/src/main/kotlin/co/nilin/opex/auth/utils/InternalIdGenerator.kt new file mode 100644 index 000000000..558d874f6 --- /dev/null +++ b/auth-gateway/auth-gateway-app/src/main/kotlin/co/nilin/opex/auth/utils/InternalIdGenerator.kt @@ -0,0 +1,9 @@ +package co.nilin.opex.auth.utils + +fun generateRandomID(length: Int = 8): String { + val charset = ('0'..'9') + ('a'..'z') + return (1..length) + .map { charset.random() } + .joinToString("") +} + diff --git a/common/src/main/kotlin/co/nilin/opex/common/OpexError.kt b/common/src/main/kotlin/co/nilin/opex/common/OpexError.kt index d349f44db..9dce084b1 100644 --- a/common/src/main/kotlin/co/nilin/opex/common/OpexError.kt +++ b/common/src/main/kotlin/co/nilin/opex/common/OpexError.kt @@ -51,6 +51,8 @@ enum class OpexError(val code: Int, val message: String?, val status: HttpStatus InvalidRegisterToken(5016, "Invalid register token", HttpStatus.BAD_REQUEST), ExpiredOTP(5017, "OTP is expired", HttpStatus.BAD_REQUEST), InvalidToken(5018, "Invalid token", HttpStatus.BAD_REQUEST), + InternalIdGenerateFailed(5019, "Internal id generate failed", HttpStatus.INTERNAL_SERVER_ERROR), + // code 6000: wallet