坏蛋Dan
知乎@坏蛋Dan
发布时间:2024.1.4

前言

昨天我们实现了token相关的内容,今天我们开始来写路由。

项目地址:

由于我是先实现完再写的这篇文章,如果有些地方无法运行,可以看下我项目里的代码。

目前我还在往全栈的方向学习,所以如果看的不顺眼,请多多包涵。如果觉得那里可以改进,麻烦评论区说下,谢谢~


register

实现

第一步自然是实现注册的路由,回到我们的auth文件夹中,新建route.rs文件

这个是整体框架,我们需要用到db,所以这里需要引入,另外我们还需要数据类型,这里发送类型是POST,所以我创建了一个新的类型RegisterData,放在auth/mod.rs

我们直接derive一个FromForm[1]即可。

其中field里面的name指的是POST传过来的数据里的form字段名字

另外我们再实现一个枚举类型,用于组装RtData作为response(实际上可以和前面实现的DataType放到一起,我这里写的时候还没这个想法,所以是分开的)

这里还有一步set_token,这个函数我们在上篇文章中实现了,注册之后就没必要让用户再去登录了,直接就给他token即可。

然后回到我们的路由这里,我们来填充逻辑,我们需要实现以下部分:

  • validate_register_data:这个我们还没实现,用来校验数据是否正确的,比如email格式等
  • try_register_user:这个也还没实现,我们准备在这个函数中和数据库对接,执行SQL语句。

我们先来实现try_register_user,在auth文件夹下创建一个db_service文件,这个文件不用在mod.rspub出去,只需要引入即可,只在route.rs中使用。

这里的逻辑很简单,先通过SELECT语句查询是否已经被注册了,如果没有再执行INSERT逻辑。

  • Uuid::new_v4();:创建一个uuid,来自于我们前面引入的uuid[2]依赖
  • md5::compute(pwd):对密码进行md5加密处理,来自于我们前面引入的md5[3]依赖

至于SQL语句我这里就不多说了

注意:这里如果是字符串,你需要加上'',不然就无法通过解析。

然后我们再来实现validate这块。

我们在auth文件夹下创建一个validate.rs文件

代码稍微有些长,但是很好理解,就是用来校验数据的。

这里用到了Regex的正则表达式,它来自于我们前面引入的regex[4]这个crate

这个validate在登录和注册都需要使用到,所以我还是把它放到全局state去了,在state/mod.rs

然后别忘了在main.rs中引入

那么这一块就完成了。

完整的register代码

第一步我们显示校验数据,错误直接去400

然后我们在query邮箱/手机号是否已被注册,是的话返回success:false

如果没有被注册就帮他注册,如果注册过程中发生问题,则返回500

最后我们在给RegisterData实现的Responder中插入tokenheader中,那么这个路由就完成了。

最后别忘了在main.rs中引入

测试

官方提供了我们单元测试和集成测试的场景,但是我这里还是不这么做了。就我个人而言,写一些公共库/组件的时候用集成测试和单元测试确实会比较好一些,但是对于业务来说,这种反而作用不大。

所以我还是走传统的方式,通过第三方工具来测试接口。

我这里选择的是ApiFox的谷歌/edge浏览器插件:Apifox Browser Extension - Microsoft Edge Addons

我偶然发现的,本来打算看下有没有postman的,结果看到了这个。

试了下发现挺不错的,数据是远程的,也就是说换台电脑依旧是这些接口,非常方便。

我这里简单的测试下即可,其它几种场景我开发的时候已经测试过了。

这里的user_id忘了去掉了。。。。。

这个时候我们在header里就能拿到token了。

别忘了配置开发环境的基础路径


login

实现

登录的逻辑和注册的差不多。

我们先去type/mod.rs中新增一个类型

我们在这里插入token,并且将is_valid_token置为true,这样避免fairing那边on_reponse造成的误伤。

这里我还做了对user_id的数据隐藏,register是之前写的,忘了加上了。。。

  • row.get:::由于我们数据库那边iduuid类型的,所以拿出来的也是uuid,而我们传给前端的idString的,如果不做转换在runtime的时候就会有问题。

这里逻辑很简单,直接根据email/phone + 密码来查询是否存在对应信息,没有直接返回Status 400扔到捕获器那边处理。

查询过程中发生了问题,这就属于服务器内部出错,这个时候走500的场景。

我们回到auth/db_service.rs里面实现这个get_user_msg

注意这里做了加密处理,因为我们注册的时候插入到数据库里的密码是md5之后的了,所以这里也需要md5加密下。

最后别忘了在main.rs中注册


测试

这个是我们刚注册的用户,可以看到登录成功了。

token也有正常拿到


总结

至于logout就不在这实现了,由前端移除_token即可。

而注销我这偷懒觉得没必要,你也可以自己实现一个。

下一章我们来实现文章的增删改查

参考

  1. ^FromForm https://api.rocket.rs/v0.5-rc/rocket/derive.FromForm.html
  2. ^uuid https://crates.io/crates/uuid
  3. ^md5 https://crates.io/crates/md5
  4. ^regex https://crates.io/crates/regex

发布于 2023-06-07 18:01・IP 属地广东