Rust用户信息

Rust用户信息

用户信息getInfo

🍎routes.rs

在入口文件之中导入对应模块,上面我们已经导入了,然后在这里我们编写我们想要的对应接口

注册路由,集中管理接口路径映射

javascript 复制代码
src\modules\user\routes.rs

 pub fn config(cfg: &mut web::ServiceConfig) {
  cfg.route("/getInfo", web::get().to(crate::modules::user::handlers::get_info));
}

🍎简单写一个关于用户的逻辑测试接口

javascript 复制代码
src\modules\user\handlers.rs

pub async fn get_info() -> HttpResponse {
    HttpResponse::Ok().json(ApiResponse {
        code: 200,
        msg: "获取用户信息成功",
        data:  None::<()>,
    })
}

🍎访问测试

这个时候打开我们的接口,我们就可以发现

javascript 复制代码
http://127.0.0.1:8888/api/getInfo

//这个时候的返回信息
{"code":200,"msg":"获取用户信息成功"}

登录返回token

🍎Cargo.toml添加依赖

我们缺少用于处理 JWT 的 jsonwebtoken 库和用于处理时间的 chrono 库,将这两个依赖项添加到文件中

javascript 复制代码
jsonwebtoken = "9"
chrono = { version = "0.4", features = ["serde"] }

🍎依赖引入

添加依赖以后重新运行,引入对用部分的依赖

javascript 复制代码
// token部分
use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey};
use chrono::{Utc, Duration};
use serde::{Serialize, Deserialize};

🍎填写密钥定义登录返回数据类型

javascript 复制代码
// token部分
#[derive(Debug, Serialize, Deserialize)]
pub struct Claims {
    pub username: String,
    pub exp: usize,
}

#[derive(Serialize)]
pub struct LoginResponse {
    pub token: String,
    pub code: i32,
    pub msg: &'static str,
}
const JWT_SECRET: &[u8] = b"your_secret_key";

🍎登录接口之中添加token

这里我们完善一下我们登录方法login_users方法

javascript 复制代码
    if is_valid {
        // 生成 token
        let expiration = Utc::now()
        .checked_add_signed(Duration::days(1))
        .expect("valid timestamp")
        .timestamp();

        let claims = Claims {
            username: user.username.clone(),
            exp: expiration as usize,
        };

        let token = encode(&Header::default(), &claims, &EncodingKey::from_secret(JWT_SECRET))
            .unwrap();

        HttpResponse::Ok().json(LoginResponse {
            code: 200,
            msg: "登录成功",
            token: token,
        })

        // HttpResponse::Ok().json(ApiResponse {
        //     code: 200,
        //     msg: "登录成功",
        //     data:  None::<()>,
        // })
    } else {
        HttpResponse::Ok().json(ApiResponse {
            code: 400,
            msg: "用户名或密码错误",
            data:  None::<()>,
        })
    }

查看我们返回的数据,这个时候token已经给我们返回了

javascript 复制代码
{
    "token": "eyJ0Ixxxx",
    "code": 200,
    "msg": "登录成功"
}

token认证换取信息

🍎get_info接口返回我们的信息

javascript 复制代码
pub async fn get_info(req: HttpRequest, pool: web::Data<MySqlPool>) -> HttpResponse {
    // 从 header 获取 token
    let token = match req.headers().get("Authorization") {
        Some(t) => t.to_str().unwrap_or("").replace("Bearer ", ""),
        None => return HttpResponse::Unauthorized().json(ApiResponse {
            code: 401,
            msg: "未提供Token",
            data: None::<()>,
        }),
    };

    // 校验 token
    let token_data = match decode::<Claims>(
        &token,
        &DecodingKey::from_secret(JWT_SECRET),
        &Validation::default(),
    ) {
        Ok(data) => data,
        Err(_) => return HttpResponse::Unauthorized().json(ApiResponse {
            code: 401,
            msg: "Token无效或已过期",
            data: None::<()>,
        }),
    };

    // 根据 token 里的 username 查询用户信息
    let user = sqlx::query_as::<_, User>("SELECT * FROM sys_user WHERE username = ?")
        .bind(&token_data.claims.username)
        .fetch_one(pool.get_ref())
        .await;

    match user {
        Ok(u) => HttpResponse::Ok().json(ApiResponse {
            code: 200,
            msg: "获取用户信息成功",
            data: Some(u),
        }),
        Err(_) => HttpResponse::InternalServerError().json(ApiResponse {
            code: 500,
            msg: "用户不存在",
            data: None::<()>,
        }),
    }
}

测试一下,这个时候可以看到我们的信息

javascript 复制代码
{
    "code": 200,
    "msg": "获取用户信息成功",
    "data": {
        "username": "adin",
        "password": "$2b$10$lIa70GjuW6qi09u",
        "age": null,
        "name": null,
        "sex": null,
        "address": null,
        "state": null,
        "phone": "adin",
        "avatar": null,
        "user_height": null,
        "user_weight": null,
        "disease": null
    }
}

这个时候token换取我们用户信息的接口就已经好了

相关推荐
程序员爱钓鱼23 分钟前
Go语言实战案例-创建模型并自动迁移
后端·google·go
javachen__29 分钟前
SpringBoot整合P6Spy实现全链路SQL监控
spring boot·后端·sql
阿珊和她的猫2 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
uzong6 小时前
技术故障复盘模版
后端
GetcharZp6 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
加班是不可能的,除非双倍日工资7 小时前
css预编译器实现星空背景图
前端·css·vue3
桦说编程7 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研7 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi7 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
gnip8 小时前
vite和webpack打包结构控制
前端·javascript