forgot password + code for password + console log
This commit is contained in:
parent
efd2c9ea24
commit
e360cab7b0
@ -8,7 +8,7 @@ import org.example.auth.authRoutes
|
||||
import io.ktor.server.routing.routing
|
||||
|
||||
fun main() {
|
||||
embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
|
||||
embeddedServer(Netty, port = 8080, host = "localhost") {
|
||||
configureSecurity()
|
||||
configureSerialization()
|
||||
configureRouting()
|
||||
|
@ -6,44 +6,82 @@ import org.example.dto.requests.SignUpRequest
|
||||
import org.example.dto.responses.AuthResponse
|
||||
import org.example.data.DataRepository
|
||||
import io.ktor.server.application.*
|
||||
import io.ktor.server.auth.authenticate
|
||||
import io.ktor.server.auth.jwt.JWTPrincipal
|
||||
import io.ktor.server.auth.principal
|
||||
import io.ktor.server.request.*
|
||||
import io.ktor.server.response.*
|
||||
import io.ktor.server.routing.*
|
||||
import org.example.dto.requests.ForgotPasswordRequest
|
||||
import org.example.dto.requests.VerifyCodeRequest
|
||||
import org.example.dto.responses.ForgotPasswordResponse
|
||||
import org.example.dto.responses.PasswordResponse
|
||||
|
||||
fun Route.authRoutes() {
|
||||
post("/sign-up") {
|
||||
val request = call.receive<SignUpRequest>()
|
||||
println("/регистрация: $request")
|
||||
|
||||
val user = DataRepository.createUser(request)
|
||||
call.respond(AuthResponse(token = JwtConfig.makeToken(user.id)))
|
||||
println("пользователь создан: $user")
|
||||
|
||||
val token = JwtConfig.makeToken(user.id)
|
||||
println("сгенерированный токен: $token")
|
||||
|
||||
call.respond(AuthResponse(token = token))
|
||||
}
|
||||
|
||||
post("/sign-in") {
|
||||
val request = call.receive<SignInRequest>()
|
||||
println("/вход: $request")
|
||||
|
||||
val user = DataRepository.authenticate(request)
|
||||
?: throw IllegalArgumentException("Invalid credentials")
|
||||
call.respond(AuthResponse(token = JwtConfig.makeToken(user.id)))
|
||||
}
|
||||
|
||||
authenticate {
|
||||
get("/me") {
|
||||
val principal = call.principal<JWTPrincipal>()
|
||||
val userId = principal?.payload?.getClaim("userId")?.asInt()
|
||||
|
||||
if (userId == null) {
|
||||
call.respond(HttpStatusCode.Unauthorized, "Invalid token")
|
||||
return@get
|
||||
}
|
||||
|
||||
val user = DataRepository.findById(userId)
|
||||
if (user == null) {
|
||||
call.respond(HttpStatusCode.NotFound, "User not found")
|
||||
return@get
|
||||
println("ошибка аутентификации для email: ${request.email}")
|
||||
throw IllegalArgumentException("Invalid credentials")
|
||||
}
|
||||
|
||||
call.respond(user)
|
||||
val token = JwtConfig.makeToken(user.id)
|
||||
println("успешный вход для: ${user.email}, токен: $token")
|
||||
|
||||
call.respond(AuthResponse(token = token))
|
||||
}
|
||||
|
||||
post("/forgot-password") {
|
||||
val request = call.receive<ForgotPasswordRequest>()
|
||||
println("запрос на сброс пароля для: ${request.email}")
|
||||
|
||||
try {
|
||||
val code = DataRepository.initiatePasswordReset(request.email)
|
||||
println("код сброса пароля для ${request.email}: $code")
|
||||
|
||||
call.respond(
|
||||
ForgotPasswordResponse(
|
||||
message = "Код отправлен на email",
|
||||
code = code
|
||||
)
|
||||
)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
println("ошибка при сбросе пароля: ${e.message}")
|
||||
call.respond(
|
||||
HttpStatusCode.BadRequest,
|
||||
ForgotPasswordResponse(message = e.message ?: "Ошибка")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
post("/verify-reset-code") {
|
||||
val request = call.receive<VerifyCodeRequest>()
|
||||
println("проверка кода ${request.code} для ${request.email}")
|
||||
|
||||
try {
|
||||
val password = DataRepository.verifyResetCode(request.email, request.code)
|
||||
println("успешная проверка кода для ${request.email}, пароль: $password")
|
||||
|
||||
call.respond(PasswordResponse(password = password))
|
||||
} catch (e: IllegalArgumentException) {
|
||||
println("неверный код для ${request.email}: ${request.code}")
|
||||
call.respond(
|
||||
HttpStatusCode.BadRequest,
|
||||
ForgotPasswordResponse(message = e.message ?: "Неверный код")
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
@ -7,13 +7,14 @@ import java.util.concurrent.atomic.AtomicInteger
|
||||
|
||||
object DataRepository {
|
||||
private val users = mutableListOf<User>()
|
||||
private val idCounter = AtomicInteger(1) // Автоинкремент ID
|
||||
private val idCounter = AtomicInteger(1)
|
||||
private val passwordResetCodes = mutableMapOf<String, String>()
|
||||
|
||||
fun createUser(request: SignUpRequest): User {
|
||||
val user = User(
|
||||
id = idCounter.getAndIncrement(),
|
||||
email = request.email,
|
||||
password = request.password, // В реальном приложении хешируйте пароль!
|
||||
password = request.password,
|
||||
name = request.name
|
||||
)
|
||||
users.add(user)
|
||||
@ -28,6 +29,28 @@ object DataRepository {
|
||||
return users.find { it.id == id }
|
||||
}
|
||||
|
||||
fun initiatePasswordReset(email: String): String {
|
||||
val user = users.find { it.email == email }
|
||||
?: throw IllegalArgumentException("User not found")
|
||||
|
||||
val code = (100000..999999).random().toString()
|
||||
passwordResetCodes[email] = code
|
||||
|
||||
return code
|
||||
}
|
||||
|
||||
fun verifyResetCode(email: String, code: String): String {
|
||||
val storedCode = passwordResetCodes[email]
|
||||
?: throw IllegalArgumentException("No code requested for this email")
|
||||
|
||||
if (storedCode != code) {
|
||||
throw IllegalArgumentException("Invalid code")
|
||||
}
|
||||
|
||||
return users.find { it.email == email }?.password
|
||||
?: throw IllegalArgumentException("User not found")
|
||||
}
|
||||
|
||||
init {
|
||||
createUser(
|
||||
SignUpRequest(
|
||||
|
8
src/main/kotlin/dto/requests/ForgotPasswordRequest.kt
Normal file
8
src/main/kotlin/dto/requests/ForgotPasswordRequest.kt
Normal file
@ -0,0 +1,8 @@
|
||||
package org.example.dto.requests
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class ForgotPasswordRequest(
|
||||
val email: String
|
||||
)
|
9
src/main/kotlin/dto/requests/VerifyCodeRequest.kt
Normal file
9
src/main/kotlin/dto/requests/VerifyCodeRequest.kt
Normal file
@ -0,0 +1,9 @@
|
||||
package org.example.dto.requests
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class VerifyCodeRequest(
|
||||
val email: String,
|
||||
val code: String
|
||||
)
|
9
src/main/kotlin/dto/responses/ForgotPasswordResponse.kt
Normal file
9
src/main/kotlin/dto/responses/ForgotPasswordResponse.kt
Normal file
@ -0,0 +1,9 @@
|
||||
package org.example.dto.responses
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class ForgotPasswordResponse(
|
||||
val message: String,
|
||||
val code: String? = null
|
||||
)
|
8
src/main/kotlin/dto/responses/PasswordResponse.kt
Normal file
8
src/main/kotlin/dto/responses/PasswordResponse.kt
Normal file
@ -0,0 +1,8 @@
|
||||
package org.example.dto.responses
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class PasswordResponse(
|
||||
val password: String
|
||||
)
|
Loading…
Reference in New Issue
Block a user