axum 中间件 - 无法将 jwt 声明传播到下一个处理程序

问题描述 投票:0回答:1

我知道这看起来是一个非常基本且愚蠢的问题。 但我一直无法解决这个问题。

在我的 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
的扩展。

我可能在这里犯了一些非常基本的错误,但我无法找出这里出了什么问题。

rust middleware rust-axum
1个回答
0
投票

好的,这个错误

body="缺少请求扩展:类型扩展 没有找到

serde_json::value::Value
。也许你忘记添加 它?参见
axum::Extension
。” Rejection_type="axum::extract::rejection::MissingExtension"

表示 serde_json::value::Value 存在问题,实际上与 Claims 无关。我已更正代码以重新引入 json 模式验证器以及 jwt 验证器。

现在一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.