从零开始的IM聊天系统(七)——登录接口准备

98 阅读3分钟

我的个人博客已经上线,接下来的内容我会记录在个人博客中,欢迎来踩qaq。。。

windy Xu's Site (xuchengyu1212.cloud)

接下来我会在个人博客中更新Docker相关内容以及如何在docker中部署redis缓存池。欢迎围观

之前一节课呢,我们成功实现了加密的操作,接下来我们来实现一下登录功能。

通过用户名和密码检索用户信息

为models中的user_basic.go文件中添加FindUserByNameAndPwd方法,用来通过名字和密码检索表数据:

func FindUserByNameAndPwd(name, password string) UserBasic {
   user := UserBasic{}
   utils.DB.Where("name = ? and password = ?", name, password).First(&user)
   return user
}

完成这一步之后呢,在service方法中添加登录方法:

// FindUserByNameAndPwd
// @Summary 查找单个用户
// @Tags 用户模块
// @param name query string false "用户名"
// @param password query string false "密码"
// @Success 200 {string} json{"code", "message"}
// @Router /user/getUserList [post]
func FindUserByNameAndPwd(c *gin.Context) {
   data := models.UserBasic{}
   name := c.Query("name")
   password := c.Query("password")
   user := models.FindUserByName(name)

   if user.Name == "" {
      c.JSON(200, gin.H{
         "code":    -1,
         "message": "该用户不存在",
         "data":    data,
      })
      return
   }
   fmt.Println(user)
   flag := utils.ValidPassword(password, user.Salt, user.Password)
   if !flag {
      c.JSON(200, gin.H{
         "code":    -1,
         "message": "密码不正确",
         "data":    data,
      })
      return
   }
   pwd := utils.MakePassword(password, user.Salt)

   data = models.FindUserByNameAndPwd(name, pwd)

   c.JSON(200, gin.H{
      "code":    0, //0成功 -1失败
      "message": "登录成功",
      "data":    data,
   })
}

接下来在路由文件中引入这个方法:

r.POST("/user/findUserByNameAndPwd", service.FindUserByNameAndPwd)

即可成功完成查找用户的功能,我们可以试验一下,运行main.go文件,使用apiPost等接口调试工具,测试一下是否可以成功检索到用户数据:

image.png

登录状态的持久化

为了保证登录状态的时效性,我们需要为返回的数据中携带token。

在网络请求中,Token 通常指代一种身份验证令牌,用于验证用户的身份并授权其访问受保护的资源。Token 是一种轻量级的身份验证机制,通常由服务器生成并返回给客户端。客户端将 Token 存储在本地,然后在后续的请求中发送给服务器。

以下是 Token 的一些常见用途:

  1. API 认证:许多 Web API 需要用户进行身份验证才能访问。通过在请求头中包含 Token,服务器可以验证用户的身份并允许其访问相应的资源。
  2. 授权和权限控制:Token 可以用于授权和权限控制。例如,在一个社交网络应用中,用户可以使用他们的 Token 来查看其他用户的信息或发表自己的内容。
  3. 单点登录(SSO):当用户在一个应用程序中登录后,该应用程序可以将 Token 保存在本地。当用户尝试访问另一个受保护的应用程序时,该应用程序可以通过发送一个包含 Token 的请求来验证用户的身份。

token应该是具有时效性的,这一点在后续的redis学习中会教给大家,我们首先学习生成最基本的token:

添加最基本的token信息

在之前编写的FindUserByNameAndPwd方法中添加生成token的方法:

func FindUserByNameAndPwd(name, password string) UserBasic {
   user := UserBasic{}
   utils.DB.Where("name = ? and password = ?", name, password).First(&user)
  
   //token加密
   str := fmt.Sprintf("%d", time.Now().Unix())
   temp := utils.Md5Encode(str)
   utils.DB.Model(&user).Where("id = ?", user.ID).Update("identity", temp)
   return user
}

我们先生成一个随机数,然后使用md5的规则将随机数序列化并且保存到用户表的identity中。 测试一下token是否添加到identity字段中,运行main.go文件,并且调用查询用户的方法,查看数据库文件:

image.png

可以看到identity已经保存了一组数据,这个就是最简单的token数据了。