You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Axum中间件无法将JWT Claims传递至后续处理器问题排查

问题排查与解决步骤

核心矛盾很明确:你中间件插入的是Arc<Claims>类型的请求扩展,但处理器却在寻找serde_json::Value类型的扩展,百分百是类型不匹配导致的,按以下步骤逐一排查:

1. 检查处理器的参数定义

直接看create_workflow函数的参数,大概率是把Extension的类型写错了。

错误示例(问题大概率出在这):

async fn create_workflow(
    // 错误:这里写了serde_json::Value,和你插入的Arc<Claims>完全不匹配
    Extension(_wrong_value): Extension<serde_json::Value>,
    // 其他参数
) -> Result<Json<...>, ...> {
    // 逻辑代码
}

正确写法:

// 确保导入了正确的Claims结构体
use crate::path_to_your_claims::Claims;
use std::sync::Arc;
use axum::extract::Extension;

async fn create_workflow(
    Extension(claims): Extension<Arc<Claims>>, // 这里要和中间件插入的类型完全一致
    // 其他参数
) -> Result<Json<...>, ...> {
    // 使用claims处理业务逻辑
    Ok(Json(serde_json::json!({"msg": "success"})))
}

2. 确认Claims结构体的一致性

如果处理器里的Claims和中间件里用的不是同一个结构体(比如不同模块下的同名结构体),哪怕名字一样,Rust也会把它们当成不同类型,导致扩展找不到。

检查两处的use语句:

  • 中间件里的导入:比如use crate::models::auth::Claims;
  • 处理器里的导入:比如use crate::models::other::Claims;

如果路径不一致,统一改成同一个模块的Claims即可。

3. 验证中间件的插入逻辑

确认中间件里确实插入的是Arc<Claims>,而非误转成了serde_json::Value。

正确的插入代码示例:

use axum::http::Request;
use axum::middleware::Next;
use axum::response::Response;
use std::sync::Arc;

async fn jwt_middleware<B>(mut request: Request<B>, next: Next<B>) -> Result<Response, ...> {
    // 验证JWT,得到verified_claims: Claims
    let verified_claims = verify_jwt(...)?;
    // 插入Arc<Claims>到请求扩展
    request.extensions_mut().insert(Arc::new(verified_claims));
    Ok(next.run(request).await)
}

4. 调试扩展内容(可选)

如果以上步骤都没问题,可以在处理器里打印所有已存在的扩展类型,确认Arc<Claims>是否存在:

use axum::http::Request;

async fn create_workflow(
    request: Request<()>,
    // 其他参数
) -> Result<Json<...>, ...> {
    // 打印所有扩展的类型名
    for key in request.extensions().keys() {
        println!("Extension type: {:?}", key.name());
    }
    // 尝试手动获取Arc<Claims>
    if let Some(claims) = request.extensions().get::<Arc<Claims>>() {
        println!("Found claims: {:?}", claims);
    } else {
        println!("No Arc<Claims> found in extensions");
    }
    // ... 后续业务逻辑
}

通过打印结果,能明确扩展是否插入成功,以及处理器要找的serde_json::Value是不是哪里误加的需求。

内容的提问来源于stack exchange,提问作者Mopparthy Ravindranath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:08:25