// Package auth JWT 签发与校验。 package auth import ( "errors" "log" "os" "time" "github.com/golang-jwt/jwt/v5" ) var secret []byte // Init 读取 JWT 密钥;未配置时使用开发默认值并告警。 func Init() { s := os.Getenv("SUNDYNIX_JWT_SECRET") if s == "" { s = "sundynix-dev-secret-change-me" log.Println("[WARN] SUNDYNIX_JWT_SECRET 未设置,使用开发默认密钥,生产环境务必配置") } secret = []byte(s) } // Sign 为用户名签发 24h 有效期的 token。 func Sign(username string) (string, error) { claims := jwt.RegisteredClaims{ Subject: username, IssuedAt: jwt.NewNumericDate(time.Now()), ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), Issuer: "sundynix-site", } return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(secret) } // Parse 校验 token 并返回用户名。 func Parse(token string) (string, error) { t, err := jwt.ParseWithClaims(token, &jwt.RegisteredClaims{}, func(t *jwt.Token) (any, error) { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.New("非法签名算法") } return secret, nil }) if err != nil || !t.Valid { return "", errors.New("token 无效或已过期") } claims, ok := t.Claims.(*jwt.RegisteredClaims) if !ok { return "", errors.New("token 载荷异常") } return claims.Subject, nil }