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换取我们用户信息的接口就已经好了

相关推荐
2301_7816686123 分钟前
前端基础 JS Vue3 Ajax
前端
上单带刀不带妹1 小时前
前端安全问题怎么解决
前端·安全
Fly-ping1 小时前
【前端】JavaScript 的事件循环 (Event Loop)
开发语言·前端·javascript
SunTecTec1 小时前
IDEA 类上方注释 签名
服务器·前端·intellij-idea
在逃的吗喽2 小时前
黑马头条项目详解
前端·javascript·ajax
袁煦丞2 小时前
有Nextcloud家庭共享不求人:cpolar内网穿透实验室第471个成功挑战
前端·程序员·远程工作
超浪的晨2 小时前
Java 实现 B/S 架构详解:从基础到实战,彻底掌握浏览器/服务器编程
java·开发语言·后端·学习·个人开发
小磊哥er2 小时前
【前端工程化】前端项目开发过程中如何做好通知管理?
前端
拾光拾趣录2 小时前
一次“秒开”变成“转菊花”的线上事故
前端
你我约定有三3 小时前
前端笔记:同源策略、跨域问题
前端·笔记