package helpers import ( "fmt" "strings" "time" "github.com/gin-contrib/slog" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" "github.com/spf13/viper" ) func GenerateToken(profile_id string) (string, error) { // token_lifespan := viper.GetInt("token_hour_lifespan") claims := jwt.MapClaims{ "name": "Thomas Peetz", "admin": true, "authorized": true, "sub": profile_id, "exp": time.Now().Add(time.Hour * 72).Unix(), } // claims["authorized"] = true // claims["profile_id"] = profile_id // claims["exp"] = time.Now().Add(time.Hour * time.Duration(token_lifespan)).Unix() token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(viper.GetString("api_secret"))) } func TokenValid(c *gin.Context) error { logger := slog.Get(c) tokenString := ExtractToken(c) _, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { logger.Info("TokenValid", "Unexpected signing method", token.Header["alg"]) return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) } return []byte(viper.GetString("api_secret")), nil }) if err != nil { return err } return nil } func ExtractToken(c *gin.Context) string { logger := slog.Get(c) token := c.Query("token") if token != "" { logger.Info("ExtractToken", "token from query", token) return token } bearerToken := c.Request.Header.Get("Authorization") if len(strings.Split(bearerToken, " ")) == 2 { logger.Info("ExtractToken", "token from query", token) return strings.Split(bearerToken, " ")[1] } return "" } func ExtractTokenID(c *gin.Context) (string, error) { tokenString := ExtractToken(c) token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) } return []byte(viper.GetString("api_secret")), nil }) if err != nil { return "", err } claims, ok := token.Claims.(jwt.MapClaims) if ok && token.Valid { uid, ok := claims["profile_id"].(string) if !ok { return "", err } return uid, nil } return "", nil }