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
|
import io.ktor.server.routing.routing
|
||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
|
embeddedServer(Netty, port = 8080, host = "localhost") {
|
||||||
configureSecurity()
|
configureSecurity()
|
||||||
configureSerialization()
|
configureSerialization()
|
||||||
configureRouting()
|
configureRouting()
|
||||||
|
@ -6,44 +6,82 @@ import org.example.dto.requests.SignUpRequest
|
|||||||
import org.example.dto.responses.AuthResponse
|
import org.example.dto.responses.AuthResponse
|
||||||
import org.example.data.DataRepository
|
import org.example.data.DataRepository
|
||||||
import io.ktor.server.application.*
|
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.request.*
|
||||||
import io.ktor.server.response.*
|
import io.ktor.server.response.*
|
||||||
import io.ktor.server.routing.*
|
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() {
|
fun Route.authRoutes() {
|
||||||
post("/sign-up") {
|
post("/sign-up") {
|
||||||
val request = call.receive<SignUpRequest>()
|
val request = call.receive<SignUpRequest>()
|
||||||
|
println("/регистрация: $request")
|
||||||
|
|
||||||
val user = DataRepository.createUser(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") {
|
post("/sign-in") {
|
||||||
val request = call.receive<SignInRequest>()
|
val request = call.receive<SignInRequest>()
|
||||||
|
println("/вход: $request")
|
||||||
|
|
||||||
val user = DataRepository.authenticate(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) {
|
if (user == null) {
|
||||||
call.respond(HttpStatusCode.NotFound, "User not found")
|
println("ошибка аутентификации для email: ${request.email}")
|
||||||
return@get
|
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 {
|
object DataRepository {
|
||||||
private val users = mutableListOf<User>()
|
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 {
|
fun createUser(request: SignUpRequest): User {
|
||||||
val user = User(
|
val user = User(
|
||||||
id = idCounter.getAndIncrement(),
|
id = idCounter.getAndIncrement(),
|
||||||
email = request.email,
|
email = request.email,
|
||||||
password = request.password, // В реальном приложении хешируйте пароль!
|
password = request.password,
|
||||||
name = request.name
|
name = request.name
|
||||||
)
|
)
|
||||||
users.add(user)
|
users.add(user)
|
||||||
@ -28,6 +29,28 @@ object DataRepository {
|
|||||||
return users.find { it.id == id }
|
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 {
|
init {
|
||||||
createUser(
|
createUser(
|
||||||
SignUpRequest(
|
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