这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
登录和注册接口是后端的基础接口,学会这两个接口的全流程实现,就可以对后端服务的过程有个较为清晰的认识,这里主要阐述我的注册接口实现的总结反思。
注册的接口参数为username和password两个参数,我们返回的参数是statuscode、statusmsg、userid、以及一个token
先说总过程,controller层接收,使用service层的服务,service层继续使用DAO层服务对数据库直接操作。
我在controller接受参数前,加入了一个对两个参数进行校验的validate中间函数,这个函数会检验username是否为一个邮箱,同时检验密码是否大于五个字符
(结合你的实际需求,你可以自己设定validate)
func RegisteryValidate(c context.Context, ctx *app.RequestContext) {
username := ctx.Query("username")
err1 := validation.Validate(username, validation.Required.Error("username is required"), is.Email.Error("username must be a email address"))
password := ctx.Query("password")
err2 := validation.Validate(password, validation.Required.Error("password is required"), validation.RuneLength(6, 100).Error("字符长度应该在5~100之间"))
if err1 != nil || err2 != nil {
fmt.Println("注册参数不符合", err1, err2)
ctx.Abort()
ctx.JSON(200, pojo.UserLoginResponse{
Response: pojo.Response{StatusCode: -1, StatusMsg: "注册参数不符合要求"},
})
return
}
ctx.Next(c)
return
}
这个中间函数帮助我们校验了参数的正确性,接下来就进入controller层,我主要阐述逻辑流程。所谓注册就是把一个用户添加进我们数据库的用户表中,所以最简单的注册是这样的。
- 查看数据库是否已经有这个用户名的用户
- 如果没有,则把这个用户加进数据库
完成这两步,再把所需要的msg、id之类的返回,即完成了注册。
但是,稍微安全点,我们应该把密码加密一下,再放进数据库,防止密码的泄露,所以我们在service层添加一个加密函数,加密密码后,再放进数据库。
func Encoder(password string) (passwordEncoded string) {
w := sha256.New()
io.WriteString(w, password)
bw := w.Sum(nil) //w.Sum(nil)将w的hash转成[]byte格式
passwordEncoded = hex.EncodeToString(bw)
return
}
另外,在放入用户之后,我按照其用户名提取出来返回,如果发现该用户并不存在,则说明我们没有存入这个用户,就返回注册失败的信息。
最后,一个完整的注册,还需要我们学会制造出token,再把token随response返回。
token的作用是帮助我们鉴权,可以使的我们的登录长期有效等等,token的实现也非常简单,这里不再多说。
最后我想说,注册和登录接口实现之前,应该先完成好用户表的设计,一个优秀丰满的用户表将是写好接口的前提。