大项目笔记2 | 青训营笔记

60 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第6天

今日成果

`

jwt-auth:

位于middleware/jwt路径下

token生成和确认, 目前token中只放置了username

鉴权已注射于gin路由中,会最先执行,若通过鉴权,则会将解析出的username放于 gin.context的键值对中,可通过调用username := context.GetString("username")提取;若没通过鉴权,则不会运行controller代码

未测试,需等待用户注册接口完成,用户注册产生token清调用token.go - GenerateToken(name string)

其他

  • 没有采用 jti, 因此有重放攻击危险,不打算考虑此问题

  • jwt可选字段中,只使用了过期时间为24h,其他如发行方、接收方字段均未使用

videoController

pubish - 发布视频

文件服务器 :

  1. 配置ftp服务器,用于service服务器发送视频文件
  2. 安装ffmpeg命令 并通过 ssh 连接
  3. Nginx对外提供获取视频和封面的服务 (均为静态资源)

核心逻辑:

用户调动publish -> service服务器读取data数据 -> 将视频文件发往nginx -> 通过ssh调用ffmpeg服务得到视频起始帧图片并存于nginx服务器 -> 图片存于本地

ffmpeg命令于文件服务器中执行,因此nginx ftp ffmpeg均在一台服务器上


func AuthGet() gin.HandlerFunc {
	return func(c *gin.Context) {
		tokenString := c.Query("token")
		if len(tokenString) == 0 {
			c.Abort()
			c.JSON(http.StatusUnauthorized, Response{
				StatusCode: -1,
				StatusMsg:  "Unauthorized",
			})
			return
		}
		token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
			return []byte(mySigningKey), nil
		})

		if err == nil {
			if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
				log.Println("Token right : ", claims.Name)
				c.Set("username", claims.Name)
				c.Next()
				return
			}
		}
		log.Println("token error!")
		c.Abort()
		c.JSON(http.StatusUnauthorized, Response{
			StatusCode: -1,
			StatusMsg:  "Token Error",
		})

	}
}
func AuthGetWithoutLogin() gin.HandlerFunc {
	return func(c *gin.Context) {
		tokenString := c.Query("token")
		if len(tokenString) == 0 {
			c.Set("username", "")
			c.Next()
			return
		}
		token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
			return []byte(mySigningKey), nil
		})

		if err == nil {
			if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
				log.Println("Token right : ", claims.Name)
				c.Set("username", claims.Name)
				c.Next()
				return
			}
		}
		log.Println("token error!")
		c.Abort()
		c.JSON(http.StatusUnauthorized, Response{
			StatusCode: -1,
			StatusMsg:  "Token Error",
		})

	}
}

func AuthPost() gin.HandlerFunc {
	return func(c *gin.Context) {
		tokenString := c.PostForm("token")
		if tokenString == "" {
			tokenString = c.Query("token")
		}
		// log.Println(tokenString)
		// log.Println(len(tokenString))
		if len(tokenString) == 0 {
			c.Abort()
			c.JSON(http.StatusUnauthorized, Response{
				StatusCode: -1,
				StatusMsg:  "Unauthorized",
			})
			return
		}
		token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
			return []byte(mySigningKey), nil
		})
		if err == nil {
			if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
				log.Println("Token right : ", claims.Name)
				c.Set("username", claims.Name)
				c.Next()
				return
			}
		}
		log.Println("token error!!!")
		c.Abort()
		c.JSON(http.StatusUnauthorized, Response{
			StatusCode: -1,
			StatusMsg:  "Token Error",
		})

	}
}