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

如何使用Rust Warp从浏览器Cookie中获取JWT Token?

在Rust Warp中从Cookie获取JWT Token的实现方案

核心思路

Warp内置了cookie提取器,可直接从请求中提取指定名称的Cookie值,结合jsonwebtoken库就能完成JWT的解析与验证。下面是适配你项目的具体实现步骤:

1. 确认依赖配置

在Cargo.toml中确保包含以下依赖(缺失则补充):

[dependencies]
warp = "0.3"
jsonwebtoken = "8"
serde = { version = "1", features = ["derive"] }
chrono = { version = "0.4", features = ["serde"] }
tokio = { version = "1", features = ["full"] }

2. 定义JWT结构体与验证逻辑

假设你的JWT Payload结构体如下(可根据实际业务调整字段):

use jsonwebtoken::{decode, DecodingKey, Validation, Algorithm};
use serde::{Deserialize, Serialize};
use chrono::{Utc, DateTime};

#[derive(Debug, Serialize, Deserialize)]
struct Claims {
    sub: String, // 用户唯一标识(如ID或用户名)
    exp: DateTime<Utc>, // Token过期时间
}

// 验证JWT Token有效性的函数
fn validate_jwt(token: &str, secret: &str) -> Result<Claims, jsonwebtoken::errors::Error> {
    let decoding_key = DecodingKey::from_secret(secret.as_ref());
    let validation = Validation::new(Algorithm::HS256);
    decode::<Claims>(token, &decoding_key, &validation).map(|data| data.claims)
}

3. 实现Cookie提取与认证中间件

创建Warp过滤器,用于提取Cookie中的Token并完成验证:

use warp::{Filter, Rejection, Reply};
use std::env;

// 从环境变量读取JWT密钥(避免硬编码)
fn get_jwt_secret() -> String {
    env::var("JWT_SECRET").unwrap_or_else(|_| "your_default_dev_secret".to_string())
}

// 认证中间件:提取Cookie并验证JWT
fn with_authenticated_user() -> impl Filter<Extract = (Claims,), Error = Rejection> + Clone {
    warp::cookie("auth_token") // 替换为你登录接口设置的Cookie名称
        .and_then(|token: String| async move {
            let secret = get_jwt_secret();
            match validate_jwt(&token, &secret) {
                Ok(claims) => Ok(claims),
                Err(_) => Err(warp::reject::custom(AuthError::InvalidToken)),
            }
        })
}

// 自定义认证错误类型,用于Warp的拒绝处理
#[derive(Debug)]
enum AuthError {
    InvalidToken,
}

impl warp::reject::Reject for AuthError {}

4. 保护需要认证的路由

将认证中间件应用到需要权限验证的路由上:

// 示例:需要认证的用户信息接口
fn protected_routes() -> impl Filter<Extract = impl Reply, Error = Rejection> {
    warp::path("api")
        .and(warp::path("user"))
        .and(warp::get())
        .and(with_authenticated_user())
        .map(|claims: Claims| {
            format!("当前登录用户:{}", claims.sub)
        })
}

// 整合所有路由并启动服务
#[tokio::main]
async fn main() {
    let routes = protected_routes().or(/* 你的注册、登录等公开路由 */);
    warp::serve(routes).run(([127, 0, 0, 1], 3030)).await;
}

关键注意事项

  • 登录成功设置Cookie时,务必开启HttpOnly和生产环境下的Secure属性,防范XSS攻击:
    use warp::http::Cookie;
    use time::Duration;
    
    // 登录成功后生成Cookie
    let cookie = Cookie::build("auth_token", generated_jwt)
        .http_only(true)
        .secure(true) // 生产环境启用
        .path("/")
        .max_age(Duration::hours(24))
        .finish();
    // 将Cookie写入响应头
    warp::reply::with_header(warp::reply(), "Set-Cookie", cookie.to_string())
    
  • 生产环境不要硬编码JWT密钥,通过环境变量注入更安全。

内容的提问来源于stack exchange,提问作者Dev-DhanushKumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:45:05