注册接口实现总结与思考 | 青训营笔记

112 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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的实现也非常简单,这里不再多说。

最后我想说,注册和登录接口实现之前,应该先完成好用户表的设计,一个优秀丰满的用户表将是写好接口的前提。