package jwt import ( "net" "strings" "sundynix-go/global" "sundynix-go/model/system" systemReq "sundynix-go/model/system/request" "github.com/gin-gonic/gin" ) // GetLoginToken 获取登录token func GetLoginToken(user system.Login) (token string, claims systemReq.CustomClaims, err error) { j := NewJWT() claims = j.CreateClaims(systemReq.BaseClaims{ Account: user.GetAccount(), ID: user.GetUserId(), }) token, err = j.CreateToken(claims) return } // GetToken 从请求头中获取JWT token,并确保其有效性 // // 参数: // - c: *gin.Context, Gin框架的上下文对象,用于获取请求信息和设置响应。 // // 返回值: // - string: 获取到的JWT token,如果获取失败则返回空字符串。 func GetToken(c *gin.Context) string { // 从请求头中获取Authorization字段的值 token := c.Request.Header.Get("Authorization") prefix := strings.HasPrefix(token, "Bearer ") if prefix { token = strings.TrimPrefix(token, "Bearer ") } // 返回获取到的token return token } // ClearToken 清除Cookie中的token func ClearToken(c *gin.Context) { host, _, err := net.SplitHostPort(c.Request.Host) if err != nil { host = c.Request.Host } if net.ParseIP(host) != nil { c.SetCookie("sundynix-token", "", -1, "/", "", false, false) } else { c.SetCookie("sundynix-token", "", -1, "/", host, false, false) } } // GetUserInfo 从 gin.Context 中获取用户信息,并返回 CustomClaims 类型的指针。 // 该函数首先尝试从上下文中获取已存在的 claims,如果不存在,则调用 GetClaims 函数获取 claims。 // 如果获取 claims 失败,则返回 nil。 // // 参数: // - c: *gin.Context, gin 框架的上下文对象,用于获取请求相关的信息。 // // 返回值: // - *systemReq.CustomClaims: 返回用户的自定义 claims 信息,如果获取失败则返回 nil。 func GetUserInfo(c *gin.Context) *systemReq.CustomClaims { // 尝试从上下文中获取已存在的 claims if claims, exists := c.Get("claims"); !exists { // 如果 claims 不存在,则调用 GetClaims 函数获取 claims if cl, err := GetClaims(c); err != nil { // 如果获取 claims 失败,返回 nil return nil } else { // 成功获取 claims,返回 claims return cl } } else { // 如果 claims 存在,将其转换为 CustomClaims 类型并返回 waitUse := claims.(*systemReq.CustomClaims) return waitUse } } // GetUserId 从 gin.Context 中获取用户 ID,并返回 uint 类型的 ID。 // 该函数首先尝试从上下文中获取已存在的 claims,如果不存在,则调用 GetClaims 函数获取 claims。 // 如果获取 claims 失败,则返回 0。 // // 参数: // - c: *gin.Context, gin 框架的上下文对象,用于获取请求相关的信息。 // // 返回值: // - uint: 返回用户的 ID,如果获取失败则返回 0。 func GetUserId(c *gin.Context) string { if claims, exists := c.Get("claims"); !exists { if cl, err := GetClaims(c); err != nil { return "0" } else { return cl.BaseClaims.ID } } else { waitUse := claims.(*systemReq.CustomClaims) return waitUse.BaseClaims.ID } } // GetClaims 从 Gin 上下文中提取并解析 JWT 令牌,返回自定义的 claims 信息。 // 该函数首先从请求头中获取 JWT 令牌,然后使用 JWT 解析器解析令牌并返回 claims。 // 如果解析过程中发生错误,函数会记录错误日志并返回错误信息。 // // 参数: // - c: *gin.Context, Gin 上下文对象,用于获取请求头中的 JWT 令牌。 // // 返回值: // - *systemReq.CustomClaims: 解析后的自定义 claims 信息。 // - error: 解析过程中发生的错误,如果解析成功则为 nil。 func GetClaims(c *gin.Context) (*systemReq.CustomClaims, error) { // 从 Gin 上下文中获取 JWT 令牌 token := GetToken(c) // 创建新的 JWT 解析器 j := NewJWT() // 解析 JWT 令牌并获取 claims 信息 claims, err := j.ParseToken(token) if err != nil { // 如果解析失败,记录错误日志 global.Logger.Error("获取用户信息失败,请检查请求头是否存在x-token且claims是否为规定结构") } // 返回解析后的 claims 信息和可能的错误 return claims, err }