feat(auth): kayıt, giriş, çıkış ve oturum (argon2 + JWT httpOnly cookie)

- Kayıt: kullanıcı + hane + örnek kategori/ödeme türü tek transaction'da
- Giriş: beni hatırla (30 gün / oturum), e-posta başına deneme sınırı
- AuthUser extractor: cookie'deki JWT'yi doğrular
- ValidJson: JSON + doğrulama, Türkçe hata mesajları
- api.http: auth istekleri eklendi
- Birim testleri: şifre, JWT, deneme sınırı, seed (11 test)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-11 23:37:52 +03:00
parent 4103b90e4b
commit d6136959b1
27 changed files with 1573 additions and 32 deletions
+12 -3
View File
@@ -1,16 +1,22 @@
mod auth;
mod config;
mod db;
#[allow(dead_code)] // AppError, Faz 1 – Adım 3 itibarıyla route'larda kullanılacak
mod error;
mod extract;
mod models;
mod routes;
mod services;
mod state;
use std::{net::SocketAddr, process::ExitCode, sync::Arc};
use std::{net::SocketAddr, process::ExitCode, sync::Arc, time::Duration};
use tracing_subscriber::EnvFilter;
use crate::{config::Config, state::AppState};
use crate::{
auth::{jwt::Jwt, limiter::LoginLimiter},
config::Config,
state::AppState,
};
#[tokio::main]
async fn main() -> ExitCode {
@@ -53,6 +59,9 @@ async fn main() -> ExitCode {
let port = config.port;
let state = AppState {
db,
jwt: Arc::new(Jwt::new(&config.jwt_secret)),
// Aynı e-postaya 15 dakikada en fazla 5 hatalı giriş denemesi
login_limiter: Arc::new(LoginLimiter::new(5, Duration::from_secs(15 * 60))),
config: Arc::new(config),
};
let app = routes::router(state);