@@ -28,18 +28,12 @@ struct LoginRequest {
|
||||
password: String,
|
||||
}
|
||||
|
||||
// 统一响应包装
|
||||
// 登录/认证类接口扁平响应(与前端约定对齐)
|
||||
#[derive(Serialize)]
|
||||
struct ApiResponse<T> {
|
||||
struct LoginResponse {
|
||||
success: bool,
|
||||
token: Option<String>,
|
||||
message: String,
|
||||
data: Option<T>,
|
||||
}
|
||||
|
||||
// 登录业务数据
|
||||
#[derive(Serialize)]
|
||||
struct LoginData {
|
||||
token: String,
|
||||
}
|
||||
|
||||
// JWT Claims
|
||||
@@ -98,7 +92,7 @@ async fn main() {
|
||||
async fn login_handler(
|
||||
State(state): State<Arc<AppState>>,
|
||||
Json(payload): Json<LoginRequest>,
|
||||
) -> (StatusCode, Json<ApiResponse<LoginData>>) {
|
||||
) -> (StatusCode, Json<LoginResponse>) {
|
||||
info!("Login attempt for user: {}", payload.username);
|
||||
|
||||
// 查询用户账号与密码
|
||||
@@ -120,16 +114,16 @@ async fn login_handler(
|
||||
match verify(&payload.password, &password_hash) {
|
||||
Ok(true) => {
|
||||
info!("User {} logged in successfully", payload.username);
|
||||
|
||||
|
||||
// 生成 JWT
|
||||
let token = generate_token(&user_id.to_string(), &state.jwt_secret);
|
||||
|
||||
|
||||
(
|
||||
StatusCode::OK,
|
||||
Json(ApiResponse {
|
||||
Json(LoginResponse {
|
||||
success: true,
|
||||
token: Some(token),
|
||||
message: "Login successful".to_string(),
|
||||
data: Some(LoginData { token }),
|
||||
}),
|
||||
)
|
||||
}
|
||||
@@ -137,10 +131,10 @@ async fn login_handler(
|
||||
warn!("Invalid password for user {}", payload.username);
|
||||
(
|
||||
StatusCode::UNAUTHORIZED,
|
||||
Json(ApiResponse {
|
||||
Json(LoginResponse {
|
||||
success: false,
|
||||
token: None,
|
||||
message: "Invalid credentials".to_string(),
|
||||
data: None,
|
||||
}),
|
||||
)
|
||||
}
|
||||
@@ -148,10 +142,10 @@ async fn login_handler(
|
||||
warn!("Password verification error: {:?}", e);
|
||||
(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
Json(ApiResponse {
|
||||
Json(LoginResponse {
|
||||
success: false,
|
||||
token: None,
|
||||
message: "Internal error".to_string(),
|
||||
data: None,
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -28,18 +28,12 @@ struct LoginRequest {
|
||||
password: String,
|
||||
}
|
||||
|
||||
// 统一响应包装
|
||||
// 登录/认证类接口扁平响应(与前端约定对齐)
|
||||
#[derive(Serialize)]
|
||||
struct ApiResponse<T> {
|
||||
struct LoginResponse {
|
||||
success: bool,
|
||||
token: Option<String>,
|
||||
message: String,
|
||||
data: Option<T>,
|
||||
}
|
||||
|
||||
// 登录业务数据
|
||||
#[derive(Serialize)]
|
||||
struct LoginData {
|
||||
token: String,
|
||||
}
|
||||
|
||||
// JWT Claims
|
||||
@@ -98,7 +92,7 @@ async fn main() {
|
||||
async fn login_handler(
|
||||
State(state): State<Arc<AppState>>,
|
||||
Json(payload): Json<LoginRequest>,
|
||||
) -> (StatusCode, Json<ApiResponse<LoginData>>) {
|
||||
) -> (StatusCode, Json<LoginResponse>) {
|
||||
info!("Login attempt for email: {}", payload.email);
|
||||
|
||||
// 查询用户邮箱与密码
|
||||
@@ -120,16 +114,16 @@ async fn login_handler(
|
||||
match verify(&payload.password, &password_hash) {
|
||||
Ok(true) => {
|
||||
info!("Email {} logged in successfully", payload.email);
|
||||
|
||||
|
||||
// 生成 JWT
|
||||
let token = generate_token(&user_id.to_string(), &state.jwt_secret);
|
||||
|
||||
|
||||
(
|
||||
StatusCode::OK,
|
||||
Json(ApiResponse {
|
||||
Json(LoginResponse {
|
||||
success: true,
|
||||
token: Some(token),
|
||||
message: "Login successful".to_string(),
|
||||
data: Some(LoginData { token }),
|
||||
}),
|
||||
)
|
||||
}
|
||||
@@ -137,10 +131,10 @@ async fn login_handler(
|
||||
warn!("Invalid password for email {}", payload.email);
|
||||
(
|
||||
StatusCode::UNAUTHORIZED,
|
||||
Json(ApiResponse {
|
||||
Json(LoginResponse {
|
||||
success: false,
|
||||
token: None,
|
||||
message: "Invalid credentials".to_string(),
|
||||
data: None,
|
||||
}),
|
||||
)
|
||||
}
|
||||
@@ -148,10 +142,10 @@ async fn login_handler(
|
||||
warn!("Password verification error: {:?}", e);
|
||||
(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
Json(ApiResponse {
|
||||
Json(LoginResponse {
|
||||
success: false,
|
||||
token: None,
|
||||
message: "Internal error".to_string(),
|
||||
data: None,
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user