我知道这看起来是一个非常基本且愚蠢的问题。 但我一直无法解决这个问题。
在我的 Rust 应用程序中,我使用中间件来验证 JWT,然后将其传递给下一个处理程序,如下所示。
pub async fn jwt_validator(mut req: Request, next: Next) -> Result<Response, StatusCode> {
// exclude some non protected endpoints
let exclusion_list = vec!["/login", "/signup", "/welcome"];
let path = req.uri().path();
trace!("Checking exclusion list for path: {}...", path);
// Check if the path contains or ends with any of the exclusion list items
if exclusion_list
.iter()
.any(|item| path.contains(item) || path.ends_with(item))
{
trace!("Skipping jwt validation for path: {}", path);
return Ok(next.run(req).await);
}
let auth_header = req.headers().get("Authorization");
if let Some(auth_header) = auth_header {
if let Ok(auth_str) = auth_header.to_str() {
if auth_str.starts_with("Bearer ") {
let token = &auth_str[7..];
// If validation successful, add the claims to the request extensions
if let Ok(claims) = validate_jwt(token) {
trace!("Token validated successfully: {:?}", claims);
req.extensions_mut().insert(Arc::new(claims));
return Ok(next.run(req).await);
}
}
}
}
Err(StatusCode::UNAUTHORIZED)
}
以及在 jwt 验证器之后执行的处理程序 fn。
pub async fn create_workflow(
Extension(conn): Extension<DatabaseConnection>,
Extension(payload): Extension<Value>,
Extension(claims): Extension<Arc<Claims>>,
) -> impl IntoResponse {
trace!("Executing create_workflow handler..");
// print the claims
trace!("Claims: {:?}", claims);
// Create a new uuid for workflow item.
let workflow_id = uuid::Uuid::new_v4();
// Extract customer id from token
let cust_id = uuid::Uuid::parse_str(&claims.sub).unwrap();
...
中间件 jwt 验证器似乎工作正常,即验证令牌并将声明插入到请求中以供下一个处理程序使用。 以下是确认 mw 正在将索赔数据插入到请求中的跟踪日志。
[2024-08-04T13:17:03Z TRACE workflow_cruder::middlewares::jwt_validator] Checking exclusion list for path: /api/v1/workflows...
[2024-08-04T13:17:03Z TRACE workflow_cruder::middlewares::jwt_validator] Token validated successfully: Claims { sub: "accedbaa-2c19-41bd-a7ef-f2257578f337", exp: 1722779401 }
[2024-08-04T13:17:03Z TRACE axum::rejection] rejecting request status=500 body="Missing request extension: Extension of type `serde_json::value::Value` was not found. Perhaps you forgot to add it? See `axum::Extension`." rejection_type="axum::extract::rejection::MissingExtension"
上面日志中的前两行表明 mw 正在执行其工作。 但最后一行来自处理程序,它表示未找到类型为
serde_json::value::Value
的扩展。
我可能在这里犯了一些非常基本的错误,但我无法找出这里出了什么问题。
好的,这个错误
body="缺少请求扩展:类型扩展 没有找到
。也许你忘记添加 它?参见serde_json::value::Value
。” Rejection_type="axum::extract::rejection::MissingExtension"axum::Extension
表示 serde_json::value::Value 存在问题,实际上与 Claims 无关。我已更正代码以重新引入 json 模式验证器以及 jwt 验证器。
现在一切正常。