diff --git a/src/handlers/weather.rs b/src/handlers/weather.rs index 1944725..0f5e922 100644 --- a/src/handlers/weather.rs +++ b/src/handlers/weather.rs @@ -1,4 +1,4 @@ -use actix_web::{web, delete, get, post, HttpResponse}; +use actix_web::{web, delete, get, post, HttpRequest, HttpResponse}; use sqlx::postgres::PgPool; use tracing::{debug, info}; @@ -60,19 +60,28 @@ pub async fn generate_temp_token_handler( #[get("/weather/details")] pub async fn get_weather_details( pool: web::Data, - claims: Option>, + req: HttpRequest, query: web::Query, app_state: web::Data, ) -> Result { let mut is_temp_token = false; + // 从 Authorization header 中提取并验证 JWT(自己处理,不依赖 middleware) + let claims_from_header = || -> Option { + let auth_header = req.headers().get("Authorization")?; + let auth_str = auth_header.to_str().ok()?; + let token = auth_str.strip_prefix("Bearer ")?; + let jwt_secret = &app_state.jwt_secret; + auth::verify_token(token, jwt_secret).ok() + }; + let (openid, weather_id) = if let Some(temp_token) = query.get("temp_token").and_then(|v| v.as_str()) { is_temp_token = true; let temp_claims = auth::verify_temp_token(temp_token, &app_state.jwt_secret) .map_err(|e| AppError::Unauthorized(format!("临时token无效: {}", e)))?; (temp_claims.openid, temp_claims.resource_id) - } else if let Some(claims) = claims { + } else if let Some(claims) = claims_from_header() { let weather_id = match query.get("id") { Some(v) if v.is_i64() => v.as_i64().unwrap() as i32, Some(v) if v.is_string() => {