这是我参与「第五届青训营 」笔记创作活动的第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 - 发布视频
文件服务器 :
- 配置ftp服务器,用于service服务器发送视频文件
- 安装ffmpeg命令 并通过 ssh 连接
- 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",
})
}
}