diff --git a/build.gradle.kts b/build.gradle.kts index 24a137a..f20ddff 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -48,8 +48,7 @@ dependencies { implementation(libs.spring.grpc.starter) implementation(libs.grpc.services) - - implementation("org.springframework.boot:spring-boot-starter-oauth2-client:3.4.3") + implementation(libs.spring.boot.starter.oauth2.client) runtimeOnly(libs.micrometer.registry.prometheus) runtimeOnly(libs.h2) diff --git a/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt b/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt index 968424a..cc1cb8d 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt @@ -1,5 +1,6 @@ package com.project.movienight.adapters.security +import com.project.movienight.application.ports.input.security.OAuth2UserInfo import com.project.movienight.application.ports.output.IdGenerator import com.project.movienight.application.ports.output.UserRepositoryPort import com.project.movienight.domain.model.User @@ -37,7 +38,6 @@ class CustomOAuth2UserService( } private fun findOrCreateUser(userInfo: OAuth2UserInfo): User { - // Сначала ищем по provider + provider_id (основной способ для OAuth2) val existingUser = userRepository.findByProviderAndProviderId( userInfo.getProvider(), userInfo.getProviderId() @@ -47,11 +47,9 @@ class CustomOAuth2UserService( log.debug("User found by provider: {}", userInfo.getProvider()) existingUser } else { - // Проверяем нет ли пользователя с таким email (связывание аккаунтов) val userByEmail = userRepository.findByEmail(userInfo.getEmail()) if (userByEmail != null) { - // Пользователь существует, обновляем его OAuth2 данными log.debug("Linking OAuth2 account to existing user: {}", userInfo.getEmail()) userRepository.saveWithOAuth2(userByEmail, userInfo.getProvider(), userInfo.getProviderId()) } else { diff --git a/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt index fa41de5..c463ac6 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt @@ -1,5 +1,7 @@ package com.project.movienight.adapters.security +import com.project.movienight.application.ports.input.security.OAuth2UserInfo + class GoogleOAuth2UserInfo( private val attributes: Map ) : OAuth2UserInfo { diff --git a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt b/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt index e2db545..89d6d30 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt @@ -1,5 +1,6 @@ package com.project.movienight.adapters.security +import com.project.movienight.application.ports.input.security.OAuth2UserInfo import org.springframework.security.oauth2.core.OAuth2AuthenticationException import org.springframework.security.oauth2.core.user.OAuth2User diff --git a/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt b/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt index a4d94ea..c602211 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt @@ -5,7 +5,7 @@ import org.springframework.security.core.GrantedAuthority import org.springframework.security.core.authority.SimpleGrantedAuthority import org.springframework.security.core.userdetails.UserDetails import org.springframework.security.oauth2.core.user.OAuth2User -import java.util.* +import java.util.UUID class UserPrincipal( private val user: User, diff --git a/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt index 47c41d2..e2c55c0 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt @@ -1,22 +1,26 @@ package com.project.movienight.adapters.security -@Suppress("UNCHECKED_CAST") +import com.project.movienight.application.ports.input.security.OAuth2UserInfo + class VkOAuth2UserInfo( private val attributes: Map ) : OAuth2UserInfo { override fun getProviderId(): String { - val response = attributes["response"] as? List> - return response?.firstOrNull()?.get("id")?.toString() ?: "" + return (attributes["response"] as? List<*>) + ?.firstOrNull() + ?.let { it as? Map<*, *> } + ?.get("id") + ?.toString() ?: "" } - override fun getEmail(): String = attributes["email"] as? String ?: "" + override fun getEmail(): String = attributes["email"]?.toString() ?: "" override fun getName(): String { - val response = attributes["response"] as? List> - val first = response?.firstOrNull() - val firstName = first?.get("first_name") as? String ?: "" - val lastName = first?.get("last_name") as? String ?: "" + val response = attributes["response"] as? List<*> + val first = response?.firstOrNull() as? Map<*, *> + val firstName = first?.get("first_name")?.toString() ?: "" + val lastName = first?.get("last_name")?.toString() ?: "" return "$firstName $lastName".trim() } diff --git a/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt index 467aa85..59bf3eb 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt @@ -1,6 +1,7 @@ package com.project.movienight.adapters.security -@Suppress("UNCHECKED_CAST") +import com.project.movienight.application.ports.input.security.OAuth2UserInfo + class YandexOAuth2UserInfo( private val attributes: Map ) : OAuth2UserInfo { @@ -8,11 +9,14 @@ class YandexOAuth2UserInfo( override fun getProviderId(): String = attributes["id"]?.toString() ?: "" override fun getEmail(): String { - val emails = attributes["emails"] as? List> - return emails?.firstOrNull()?.get("value") ?: "" + return (attributes["emails"] as? List<*>) + ?.firstOrNull() + ?.let { it as? Map<*, *> } + ?.get("value") + ?.toString() ?: "" } - override fun getName(): String = attributes["display_name"] as? String ?: "" + override fun getName(): String = attributes["display_name"]?.toString() ?: "" override fun getProvider(): String = "yandex" diff --git a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt similarity index 74% rename from src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfo.kt rename to src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt index b6abf09..c081592 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt @@ -1,4 +1,4 @@ -package com.project.movienight.adapters.security +package com.project.movienight.application.ports.input.security interface OAuth2UserInfo { fun getProviderId(): String